Java 重写非抽象方法是一种好的做法吗?

Java 重写非抽象方法是一种好的做法吗?,java,oop,inheritance,overriding,abstract-methods,Java,Oop,Inheritance,Overriding,Abstract Methods,我有一种情况,我需要修改超类方法,使其具有特定于子类的逻辑,但方法逻辑对于所有其他子类都是相同的 我有两个选择: 1) 使该方法抽象,并对除相关子类之外的每个子类重复相同的代码 2) 重写相关子类中的非抽象方法,我想在其中使用alterlogic 在Java中重写非抽象方法是一种好的做法吗?b/w覆盖非抽象方法和抽象方法在概念上有什么区别 在某种程度上,这是一个风格问题 这是一种常见的实践,但也有人告诉您,任何方法都不应该有多个实现。这些人声称继承层次结构中的多个实现会导致难以调试的代码,因为您

我有一种情况,我需要修改超类方法,使其具有特定于子类的逻辑,但方法逻辑对于所有其他子类都是相同的

我有两个选择:

1) 使该方法抽象,并对除相关子类之外的每个子类重复相同的代码

2) 重写相关子类中的非抽象方法,我想在其中使用alterlogic


在Java中重写非抽象方法是一种好的做法吗?b/w覆盖非抽象方法和抽象方法在概念上有什么区别

在某种程度上,这是一个风格问题

这是一种常见的实践,但也有人告诉您,任何方法都不应该有多个实现。这些人声称继承层次结构中的多个实现会导致难以调试的代码,因为您必须非常小心地确定实际调用了这种方法的哪个版本

当这些方法被其他方法大量使用时,由于某些子类中的大量重写,您很容易就失去了大局——突然间,预测某些代码正在做什么变得很复杂

要理解的关键点是:在类X中对某些方法
foo()
进行“单一”重写是很好的、常见的、良好的实践。但是在X的子类中再次重写相同的
foo()
,这会很快导致各种问题

换句话说:重新实现非抽象方法应该小心。如果这使代码更难理解,那么就寻找其他解决方案。比如:基类有一个固定的(最终的)方法来做事情,这个方法调用其他抽象方法来完成它的工作。例如:

public abstract class Base {
  public final int doSomething() {
    String tmp = foo();
    int result = bar(tmp);
    return result * result;
  }
  public abstract String foo();
  public abstract int bar(String str);
如前所述:在这里您可以看到实现是“固定的”,因为
doSomething()
是最终的-但是所需的“成分”可以(必须)在每个子类中被覆盖

在Java中重写非抽象方法是一种好的做法吗

对。(但是,请确保您没有违反(引用现有帖子),该帖子告诉子类不应破坏父类类型定义。例如,从
Animal
类重写的
walk()
方法应执行(具有)行走行为,不应执行飞行或其他操作。)

我还建议大家通过阅读来理解设计原则

从概念上来说,b/w覆盖有什么区别 非抽象与抽象方法


一点区别都没有。但是,需要明确的是,抽象方法不包含任何实现,必须重写可以重写非抽象方法的地方。

重写相关子类中的非抽象方法,我想在其中使用alter逻辑-是

例如: 如果在Object类中考虑ToStRun()和HASCODE(),这两种方法都是非抽象方法,但建议在这些子类中重写这些方法。


因为如果我想执行我的逻辑而不是超类逻辑,需要重写并使用它,建议在这种情况下重写。

重写非抽象方法是非常好的,并且通常是这样的,只要您不违反:

利斯科夫的原则对签名提出了一些标准要求

  • 子类型中方法参数的逆变
  • 子类型中返回类型的协方差
  • 子类型的方法不应引发任何新异常,除非这些异常本身是超类型的方法引发的异常的子类型
除了签名要求外,子类型还必须满足许多行为条件

  • 子类型中的前提条件不能加强
  • 子类型中的后置条件不能减弱
  • 子类型中必须保留超类型的不变量
  • 历史约束(“历史规则”)。对象被视为只能通过其方法(封装)进行修改。由于子类型可能会引入超类型中不存在的方法,因此引入这些方法可能会允许子类型中发生超类型中不允许的状态更改。历史约束禁止这样做

只要该方法在被覆盖后仍然遵守合同,就不应该混淆新实现的功能。该方法的新实现应与重写前的实现遵守相同的约定。

“在Java中重写非抽象方法是一种好做法吗?”是的。您确定继承是正确的方法吗?在做出决定之前,我已经读过了。我不太理解最后一句话,你能给我举个例子吗:“比如:基类有一个固定的(最终的)方法来做事情,而这个方法调用其他抽象方法来做它的工作。”