目前在一些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中的构造之后必须做处理。 并且在每个类的状态,许多正确init'd,这就是为什么我们有向上的痕迹f()
的。
所以构造A
是真的
A() {
//init some state in a
f(); //run f(), which will depend on the previous operation
}
如果我做了什么样new C();
我想Cf()
调用,那么Bf()
调用,那么Af()
称为
无论如何,如果有这样的一个聪明的方式,我接受它。
在调用构造函数非最终方法通常是一个坏主意-最起码,我建议你重将其记录下来。 请记住,f出现()被调用,C的构造函数不会被调用 - 既不将任何变量初始化。 该对象仅半初始化等方法将需要非常仔细地写。
有没有隐式调用方式super.f()
普通Java虽然。 由于大量警告我周围的代码推杆,一个单独的语句是远离世界的尽头:)
如果你想验证这就是所谓的,你总是可以检查的结果Af()
在A的构造函数中调用后立即-这将检查该呼叫已达到了顶级水准。
这可能会帮助你有点 - 这是强制执行的子类调用超的方式; 这将帮助您检测开发失误,其中一个子类的实施者忘了继续通话了链super.f():
class A {
boolean fDone;
public final void f() {
fDone = false;
doF();
if (!fDone) {
throw new IllegalStateException("super.f() was not called");
}
}
protected void doF() {
//do some operation
fDone = true;
}
}
class B extends A {
protected void doF() {
//some operation, maybe repeat this pattern of using a flag to enforce super call
super.doF();
}
}
所以,孩子覆盖DOF(),但需要调用super.doF();
据我所知,有没有办法做到这一点。 AspectJ的可能会做一些类似的,但是你不得不与注释标记它,我想,这不仅仅是调用工作几乎少super.f()
你需要以表示超类方法被调用,因为你需要单独不得不为每个子类,决策的能力 - 否则,你可能不希望在所有代表什么超子类 - 所以默认的是,你只要把代码。