隐式调用所有继承类的方法

时间:2015-05-17 22:31:20

标签: java oop inheritance methods

在所有继承的类上调用方法的最佳java编程实践是什么。考虑这个伪代码:

class TopLevel extends (SecondLevel extends Base)  

如果所有这些类都有方法'serializeToString',那么如何在整个继承结构中调用此方法?这个要求的原因是每个类都有自己需要序列化的变量 此外,还有一个要求:
每个类“TopLevel”和“SecondLevel”都不是而不是 asbstract,并且需要是序列化其整个继承的入口点。
例如,

SecondLevel.serializeToString()

需要在'Base'上调用该方法及其自身

TopLevel.serializeToString()

需要在'SecondLevel'和'Base'上调用该方法。

目前,我在base中有serializeToString方法,然后在整个继承上调用方法'addSerialization'(每个实现必须调用super来传播调用)
虽然这有效,但在我的代码中看起来有点麻烦,有两种方法可以实现一个(简单?)的东西 实现这一目标的最佳方式是什么?

1 个答案:

答案 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...