Java, Call overridden method implicitly

后端 未结 3 896
耶瑟儿~
耶瑟儿~ 2021-01-06 23:37

Right now in some Java code I have something like this

class A {
 void f() {

 }
 A() {
  f();
 }
}

class B extends A{
 @Override
 void f() {
  //do some st         


        
相关标签:
3条回答
  • 2021-01-07 00:23

    As far as I know, there's no way to do this. AspectJ might do something similar to this, but then you'd have to tag it with an annotation, I suppose, which is hardly less work than just calling super.f(). You need to signify that the superclass method is being called, because you need to have the ability to make that decision for each subclass separately - otherwise, you might have a subclass that doesn't want to delegate anything to the superclass at all - so the default is that you just put in the code.

    0 讨论(0)
  • 2021-01-07 00:37

    This may help you somewhat - it's a way to enforce that the child class calls the super; this would help you detect developer mistakes where the implementer of a child class forgot to continue the call up the chain to 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();
     }
    }
    

    So, the child overrides doF(), but is required to call super.doF();

    0 讨论(0)
  • 2021-01-07 00:38

    Calling non-final methods in a constructor is generally a bad idea - at the very least, I'd suggest you document it heavily. Bear in mind that when f() is called, C's constructor won't have been called - and neither will any variable initializers. The object is only half-initialized, and so methods will need to be written very carefully.

    There's no way of implicitly calling super.f() though in normal Java. Given the large warnings I'd be putting around that code, a single statement is far from the end of the world :)

    If you want to verify that it's called, you could always check for the results of A.f() in A's constructor immediately after the call - that will check that the call has reached the top level.

    0 讨论(0)
提交回复
热议问题