隐式调用所有继承的方法 类
Implicitly call method on all inherited classes
在所有继承的 class 上调用方法的最佳 java 编程实践是什么。考虑这个伪代码:
class TopLevel extends (SecondLevel extends Base)
如果所有这些class都有方法'serializeToString',那么如何在整个继承结构中调用这个方法呢?这个要求的原因是每个 class 都有自己需要序列化的变量。
另外,还有一个要求:
class 'TopLevel' 和 'SecondLevel' 都 不是 抽象,并且需要成为序列化其整个继承的入口点。
例如,
SecondLevel.serializeToString()
将需要调用 'Base' 上的方法及其本身
并且:
TopLevel.serializeToString()
需要在 'SecondLevel' 和 'Base' 上调用该方法。
目前,我在 base 中有 serializeToString 方法,然后在整个继承上调用一个方法 'addSerialization'(每个实现都必须调用 super 来传播调用)
虽然这可行,但在我的代码中似乎很混乱,有两种方法可以实现一个(简单的?)事情。
实现这一目标的最佳方法是什么?
在继承结构调用 super
中的每个 class 中相同的重写方法会给你一个指向基础 class 的调用链,每个调用 superclass 覆盖方法。
如果你不需要传递额外的参数并且return类型符合你的逻辑,你可以在每个class中调用super.serializeToString()
来调用superclass实施。
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 ...
现在,如果上述解决方案不符合您的逻辑,您将无法避免创建另一个从 superclass 调用的方法。
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...
在所有继承的 class 上调用方法的最佳 java 编程实践是什么。考虑这个伪代码:
class TopLevel extends (SecondLevel extends Base)
如果所有这些class都有方法'serializeToString',那么如何在整个继承结构中调用这个方法呢?这个要求的原因是每个 class 都有自己需要序列化的变量。
另外,还有一个要求:
class 'TopLevel' 和 'SecondLevel' 都 不是 抽象,并且需要成为序列化其整个继承的入口点。
例如,
SecondLevel.serializeToString()
将需要调用 'Base' 上的方法及其本身
并且:
TopLevel.serializeToString()
需要在 'SecondLevel' 和 'Base' 上调用该方法。
目前,我在 base 中有 serializeToString 方法,然后在整个继承上调用一个方法 'addSerialization'(每个实现都必须调用 super 来传播调用)
虽然这可行,但在我的代码中似乎很混乱,有两种方法可以实现一个(简单的?)事情。
实现这一目标的最佳方法是什么?
在继承结构调用 super
中的每个 class 中相同的重写方法会给你一个指向基础 class 的调用链,每个调用 superclass 覆盖方法。
如果你不需要传递额外的参数并且return类型符合你的逻辑,你可以在每个class中调用super.serializeToString()
来调用superclass实施。
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 ...
现在,如果上述解决方案不符合您的逻辑,您将无法避免创建另一个从 superclass 调用的方法。
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...