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

时间:2017-03-17 19:45:44

标签: java oop inheritance

我有一个超类,有2个子类。如果条件foo为真,我希望其中一个子类采取一些动作,而其他子类什么都不做:

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.
}

我提出的解决方案:

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.
   }

}

class subclass2 extends superclass {
   public void doSomething()  {
     // do nothing
   }
}

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

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:3)

这是“正确的”方法。但有些说明:

  • doSomething()可以是抽象的(如果你想强制每个子类必须提供一个特定的实现)
  • 另一方面,
  • doFoo()应该是最终的,以防止子类改变该行为。
相关问题