Java中,隐式调用覆盖的方法(Java, Call overridden method impli

2019-07-20 15:37发布

目前在一些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()称为

无论如何,如果有这样的一个聪明的方式,我接受它。

Answer 1:

在调用构造函数非最终方法通常是一个坏主意-最起码,我建议你将其记录下来。 请记住,f出现()被调用,C的构造函数不会被调用 - 既不将任何变量初始化。 该对象仅半初始化等方法将需要非常仔细地写。

有没有隐式调用方式super.f()普通Java虽然。 由于大量警告我周围的代码推杆,一个单独的语句是远离世界的尽头:)

如果你想验证这就是所谓的,你总是可以检查的结果Af()在A的构造函数中调用后立即-这将检查该呼叫已达到了顶级水准。



Answer 2:

这可能会帮助你有点 - 这是强制执行的子类调用超的方式; 这将帮助您检测开发失误,其中一个子类的实施者忘了继续通话了链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();



Answer 3:

据我所知,有没有办法做到这一点。 AspectJ的可能会做一些类似的,但是你不得不与注释标记它,我想,这不仅仅是调用工作几乎少super.f() 你需要以表示超类方法被调用,因为你需要单独不得不为每个子类,决策的能力 - 否则,你可能不希望在所有代表什么超子类 - 所以默认的是,你只要把代码。



文章来源: Java, Call overridden method implicitly