如何强制subClass在具有body的superClass中实现一个方法

时间:2017-03-03 08:33:53

标签: java android overwrite

Class Base{
    public void doThings(){
         //some logic that needed by subclass
    }
}

Class A extends Base{
      public void doThings(){
         super.doThings();
         doOtherThings();
    }
}

我想要的是强制A覆盖doThings()方法(如果没有则会出现错误信息)并调用super.doThings();但是Base中的doThings()不应该是抽象的,因为它有正文。

有没有合适的解决方案?我在下面的链接中找到了相同的问题,但接受的答案没有正确回答。 Force SubClasses to @Override method from SuperClass. Method in SuperClass must have body

3 个答案:

答案 0 :(得分:5)

如果你想确保调用基类的doThings,你应该像这样设计你的类:

abstract class Base {
  public void doThings() {
    // do some things here
    ...
    // make sure subclass does some things too
    methodYouMustImplement();
  }

  abstract void methodYouMustImplement();
}

class A extends Base {
  @Override void methodYouMustImplement() {
    // do some other things
  }
}

这样,A被迫提供了methodYouMustImplement()的实现,并且设计保证调用doThings()中的代码而不需要记住来调用super.doThings( )。 然后你可以考虑将doThings()作为最终结果,正如Andy Turner所说的那样。

答案 1 :(得分:2)

调用super方法的要求是considered an anti-pattern;除此之外,强制子类实现方法的唯一方法是将其抽象化。

如果您希望首先调用super.doThings(),然后再调用子类特定的东西,请解决问题:

  • doThings()最终
  • 添加abstract内调用的doThings()方法。

这样的事情:

abstract class Base {
  public final void doThings() {
    methodYouMustImplement();

    // Stuff after subclass-specific implementation.
  }

  abstract void methodYouMustImplement();
}

class A extends Base {
  @Override void methodYouMustImplement() {
    doOtherThings();
  }
}

doThings()final这一事实对于需求非常重要:这可以保证在调用doThings()时您希望发生的事情,因为没有子类可以更改此方法。如果您将其保留为非final,则子类可以决定覆盖doThings(),这意味着methodYouMustImplement()(以及您在doThing()中指定的任何其他操作)不一定被调用。

答案 2 :(得分:2)

我认为使用如下的构造会更容易:

public class Base {

     public void doStuff() {
         doSpecificStuff();
         // do base stuff every one has to do
     }

     abstract void doSpecificStuff();
}

public class WeirdlySpecific extends Base {

    public void doSpecificStuff() {
        // specific stuff happens
    }
}

这不会强制WeirdlySpecific实际实现doStuff()方法,但只要doStuff()被任何调用方调用为契约,每个更具体的实现都有自己的版本事件