java - 我如何强制我的类的任何子类始终调用它们正在覆盖的父类的实现方法?

标签 java oop inheritance design-patterns overriding

假设我有一个类,它实现了一个方法 (addThings())。它作为子类树的基础:

ParentClass {
    protected void addThings() {
        map.add(thing1);
        map.add(thing2);
    }
}

现在,假设我们实现了一个子类(它也有 Thing 3)并且 Thing 3 也需要添加在 Thing 1 和 Thing 2 之上

明显的 Java 解决方案似乎是让子类的方法实现调用父类的方法:

ChildClass extends ParentClass {
    protected void addThings() {
        super.addThings();
        map.add(thing3);
    }
}

问题是实现子类的人很可能会忘记这样做,并且有一个错误:

ChildClassBad extends ParentClass {
    protected void addThings() {
        // BUG!!! Forgot to call super.addThings(); !!!
        map.add(thing3); 
    }
}

Java 中是否有一种方法可以强制任何扩展的子(和孙)类在重写父类的方法时始终调用它? (类似于将方法抽象化总是强制他们实现它的方式)。

  • 请注意,我需要解决方案可以沿继承树向下传播。

    换句话说,如果有人实现需要添加 Thing4 的 GrandChildClass,他们将遭受与 ChildClass 相同的错误可能性。

    这意味着在 ParentClass 中具有单独的“addParentThings()”然后调用 addParentThings() 和子可重写的空 addThings() 的简单修复(适用于只有 1 级继承的情况)是不够的(因为孙子必须覆盖非空的 addThings)。

最佳答案

也许尝试使用调用另一个可重写方法的 final方法?

class ParentClass {

    public final void doStuff() {
        // Do stuff
        onPostDoStuff();
    }

    protected void onPostDoStuff() {
        // Override this!
    }
}

然后在子类中:

class ChildClass extends ParentClass {

    @Override
    protected void onPostDoStuff() {
        // Do extra stuff
    }
}

您甚至可以将 onPostDoStuff() 方法抽象化,这样 children 就可以覆盖它。

关于java - 我如何强制我的类的任何子类始终调用它们正在覆盖的父类的实现方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30061629/

相关文章:

java - 显式调用 @PostConstruct 注解的方法

java - JCombobox 禁用项目选择(使组合只读)

vb.net - OOP - 在哪里调用数据访问层?

php - 类实例可以自毁吗?

java - 在Java中的父类(super class)方法中创建一个新的子类

c++ - 禁止继承

java - 分析单词文本的算法

java.lang.NullPointerException 找不到源

c# - 何时检查对象的状态,一般 OOP,C# 中的示例

python - 继承自 defaultdict 和 OrderedDict