【发布时间】:2015-07-15 16:45:16
【问题描述】:
假设我有一个类,它实现了一个方法 (addThings())。它是子类树的基础:
ParentClass {
protected void addThings() {
map.add(thing1);
map.add(thing2);
}
}
现在,假设我们实现了一个子类(其中也包含事物 3),并且还需要将事物 3 添加到在事物 1 和事物 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)。
【问题讨论】:
-
据我所知,您无法强化对超级方法的调用。您能否详细说明为什么要使用这种机制?也许你有一个XY-Problem?
-
@Turing85 - 我正在实现一个父类,它会存在一段时间,并且可能会被子类化很多。我发现了一个明显可能是任何子类实现者都会遇到的错误,我想要一个基于 Java 编译器的解决方案来解决这个问题(而不是“写一条评论告诉人们这样做并希望他们阅读了评论”)
-
我明白你的一般想法,但我认为你可以通过另一种方式来防止这个问题。在给定的示例中,您可以通过构造函数来加强您的条件,但我认为您的情况并不那么简单。
-
@Turing85 - 必须在对象上多次调用该方法,因此不幸的是,构造函数不是可行的方法(我的同事已经建议 :)
标签: java oop inheritance design-patterns overriding