在所有继承类上调用方法的最佳 Java 编程实践是什么。考虑这个伪代码:
class TopLevel extends (SecondLevel extends Base)
如果所有这些类都有“serializeToString”方法,那么我如何在整个继承结构中调用这个方法?之所以有此要求,是因为每个类都有自己需要序列化的变量。
另外,还有一个要求:
“TopLevel”和“SecondLevel”类都不是抽象的,需要作为序列化其整个继承的入口点。
例如,
SecondLevel.serializeToString()
将需要调用“Base”上的方法及其自身
和:
TopLevel.serializeToString()
需要在“SecondLevel”和“Base”上调用该方法。
目前,我在 base 中有 serializeToString 方法,然后在整个继承中调用方法“addSerialization”(每个实现都必须调用 super 来传播调用)
虽然这可行,但在我的代码中使用两种方法来实现一个(简单的?)事情似乎很困惑。
实现这一目标的最佳方法是什么?
最佳答案
调用 super
的继承结构中每个类中的相同覆盖方法将为您提供对基类的一系列调用,每个调用都调用父类(super class)覆盖方法。
如果你不需要传递额外的参数并且返回类型符合你的逻辑,你可以在每个类中调用super.serializeToString()
来调用父类的实现。
class TopLevel {
@Override public String serializeToString() {
return super.serializeToString() // calls SecondLevel implementation
+ ", topLevelAttribute: 1";
}
}
class SecondLevel {
@Override public String serializeToString() {
return super.serializeToString() // calls Base implementation
+ ", secondLevelAttribute: 2";
}
}
// and so on ...
现在,如果上述解决方案不符合您的逻辑,您将无法避免创建另一个从父类(super class)调用的方法。
class Base {
public String serializeToString() {
StringBuilder sb = new StringBuilder();
appendSerializedTo(sb);
return sb.toString();
}
// can be abstract if there's no implementation here
protected void appendSerializedTo(StringBuilder sb) {
sb.append("baseAttribute: 3");
}
}
class SecondLevel {
@Override protected void appendSerializedTo(StringBuilder sb) {
super.appendSerializedTo(sb); // calls Base implementation
sb.append("secondLevelAttribute: 2");
}
}
// and so on...
关于java - 隐式调用所有继承类的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30292830/