在所有继承的类上调用方法的最佳java编程实践是什么。考虑这个伪代码:
class TopLevel extends (SecondLevel extends Base)
如果所有这些类都有方法'serializeToString',那么如何在整个继承结构中调用此方法?这个要求的原因是每个类都有自己需要序列化的变量
此外,还有一个要求:
每个类“TopLevel”和“SecondLevel”都不是而不是 asbstract,并且需要是序列化其整个继承的入口点。
例如,
SecondLevel.serializeToString()
需要在'Base'上调用该方法及其自身
和
TopLevel.serializeToString()
需要在'SecondLevel'和'Base'上调用该方法。
目前,我在base中有serializeToString方法,然后在整个继承上调用方法'addSerialization'(每个实现必须调用super来传播调用)
虽然这有效,但在我的代码中看起来有点麻烦,有两种方法可以实现一个(简单?)的东西
实现这一目标的最佳方式是什么?
答案 0 :(得分:3)
在调用super
的继承结构中,每个类中的相同override方法将为您提供一系列对基类的调用,每个调用超类覆盖方法。
如果您不需要传递额外参数并且返回类型与您的逻辑兼容,则可以在每个类中调用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 ...
现在,如果上面的解决方案不适合你的逻辑,你就不能避免创建从超类调用的另一个方法。
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...