现在在一些 Java 代码中我有这样的东西
class A {
void f() {
}
A() {
f();
}
}
class B extends A{
@Override
void f() {
//do some stuff
super.f();
}
}
class C extends B {
@Override
void f() {
//do some stuff
super.f();
}
}
我想要调用 f()
,然后向上迭代每个父类,运行重写的 f()
。我通过显式调用 super.f()
来做到这一点,尽管我不想这样做。
我这样做的原因是在到达 A 中的构造函数之后必须进行后处理。每个类中都有可以正确初始化的状态,这就是为什么我们有 f()
的向上跟踪。
所以A
的构造函数确实是
A() {
//init some state in a
f(); //run f(), which will depend on the previous operation
}
如果我执行类似 new C();
的操作,我希望调用 C.f()
,然后调用 B.f()
,然后调用 A.f()
调用
无论如何,如果有更聪明的方法来做到这一点,我愿意接受。
最佳答案
在构造函数中调用非 final方法通常是一个坏主意 - 至少,我建议您详细记录它。请记住,当调用 f() 时,不会调用 C 的构造函数 - 也不会调用任何变量初始值设定项。该对象仅初始化了一半,因此需要非常仔细地编写方法。
尽管在普通 Java 中,无法隐式调用 super.f()
。考虑到我会在该代码周围放置大量警告,单个语句远非世界末日:)
如果您想验证它是否被调用,您可以随时在调用后立即检查 A 的构造函数中 A.f()
的结果 - 这将检查调用是否已到达顶层。
关于Java,隐式调用重写方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1511822/