在我需要修改超类方法以具有子类特定逻辑的情况下,方法逻辑对于所有其他子类都是相同的。
我有两个选择:
1)使方法抽象,并对除我的相关子类之外的每个子类重复相同的代码。
2)重写相关子类中的非抽象方法,其中我希望有alter逻辑。
在Java中重写非抽象方法是一个很好的实践吗?在概念上,b/w覆盖非抽象和抽象的方法会有什么区别。
发布于 2018-01-06 06:21:21
在某种程度上,这是一个风格的问题。
这是一个常见的实践--但是也有人告诉您,任何方法都不应该有一个以上的实现。这些人声称,继承层次结构中的多个实现导致了很难调试的代码,因为您必须非常小心地确定实际调用该方法的哪个版本。
当这些方法被其他方法大量使用时,您可以很容易地松开大局--突然之间,预测某些代码所做的事情变得复杂起来--因为在某些子类中有很重的重写功能。
需要理解的关键是:对于类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);如前所述:在这里您可以看到implementation是“固定的”,因为doSomething()是最终的-但是所需的“成分”可以(必须)在每个子类中被覆盖。
发布于 2018-01-06 06:21:50
在Java中重写非抽象方法是一个很好的实践吗?
是。(但是,请确保您没有违反Liskov Substitution Principle (引用现有的帖子),它告诉子类不应该破坏父类类型的定义。例如,重写于walk ()类的Animal方法应该执行(具有)步行的行为,它不应该执行飞行或其他操作。
我还建议通过固体原理来理解设计原则。
在概念上,b/w覆盖非抽象和抽象的方法会有什么区别。
AFAIK没有差别。但是,为了明确起见,抽象方法不包含任何实现,而且您的必须重写非抽象方法可以覆盖的位置。
发布于 2018-01-06 06:39:29
重写相关子类中的非抽象方法,其中我希望具有更改逻辑-是的。
例如:如果考虑对象类中的toString()和hashCode(),那么这两种方法都是非抽象方法,但通常建议重写子类中的这些方法。
因为如果我想要执行我的逻辑而不是超类逻辑,需要重写并使用它,因此建议在这种情况下重写。
https://stackoverflow.com/questions/48124801
复制相似问题