【问题标题】:Implicitly call method on all inherited classes隐式调用所有继承类的方法
【发布时间】:2015-07-29 08:17:21
【问题描述】:

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

class TopLevel extends (SecondLevel extends Base)  

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

SecondLevel.serializeToString()

将需要调用 'Base' 上的方法及其自身

还有:

TopLevel.serializeToString()

需要在“SecondLevel”和“Base”上调用方法。

目前,我在 base 中有 serializeToString 方法,然后在整个继承上调用方法“addSerialization”(并且每个实现都必须调用 super 以传播调用)
虽然这可行,但在我的代码中使用两种方法来实现一个(简单?)事情似乎很混乱。
实现这一目标的最佳方法是什么?

【问题讨论】:

    标签: java oop inheritance methods


    【解决方案1】:

    在调用super 的继承结构中每个类中的相同覆盖方法将为您提供对基类的调用链,每个调用都调用超类的覆盖方法。

    如果你不需要传递额外的参数并且返回类型与你的逻辑兼容,你可以在每个类中调用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...
    

    【讨论】:

    • 如果有多个对象图都使用同一个基类,那么调用顶级方法如何导致方法调用在所有对象图中传播?
    • 他在问“我怎样才能在整个继承结构中调用这个方法?”您始终可以使用super 向上继承结构。
    • 不完全是:我需要能够在继承结构中的每个类上调用一个方法,但是;该方法可以在中间类上调用。例如,在 MiddleClass(它是 TopClass 的一个实例)上调用“x”。因此,您可以看到我需要如何来回传播呼叫。 @ericbn 明白我认为
    猜你喜欢
    • 2013-04-17
    • 2015-12-04
    • 1970-01-01
    • 2021-06-17
    • 2021-09-28
    • 2014-11-24
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多