是否有子类中的空方法的解决方案?

Jav*_*per 0 java oop inheritance

我有一个超类,有2个子类.如果条件foo为true,我希望其中一个子类采取某些操作,而其他子类不执行任何操作:

public void doFoo() {
   // some 10 lines common to both subclasses.
   boolean foo = checkFoo();

   /**
    *  if foo is true, subclass1 should do something. subcass2 does nothing.
    */ 

   // some 10 lines common to both subclasses.
}
Run Code Online (Sandbox Code Playgroud)

我提出的解决方案:

public void doFoo() {
   // some 10 lines common to both subclasses.
   boolean foo = checkFoo();

   if (foo) {
      doSomething();
   } 

   // some 10 lines common to both subclasses.
}

class subclass1 extends superclass {
   public void doSomething()  {
     // some lines of code.
   }
Run Code Online (Sandbox Code Playgroud)

}

class subclass2 extends superclass {
   public void doSomething()  {
     // do nothing
   }
}
Run Code Online (Sandbox Code Playgroud)

对这个常见问题更清洁,更好,更标准的解决方案?

Joh*_*ger 6

您所描述的内容有一个名称:它是模板方法模式.设计模式现在并没有像过去那样被大肆宣传,但模板方法模式仍然是一种经过验证的方法,可以解决您描述的一般问题.

如果你想避免doSomething()在子类中编写空方法,那么解决它的一种doSomething()方法是将一个空方法放在超类上.这可以服务多个子类(假设你有两个以上的整体担心),但就个人而言,我倾向于对此有点皱眉.覆盖非抽象方法应该是罕见的(充其量)异常,而不是常见的做法.