【问题标题】:Is there a solution to empty methods in subclass?子类中的空方法有解决方案吗?
【发布时间】:2017-03-17 19:45:44
【问题描述】:

我有一个超类,有 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
   }
}

对于这个常见问题有什么更简洁、更好、更标准的解决方案吗?

【问题讨论】:

  • 派生类中是否需要显式的空函数?你可以只在基类中有一个空函数,只在需要它的子类中覆盖它

标签: java oop inheritance


【解决方案1】:

你所描述的有一个名字:它是Template Method pattern。如今,设计模式已不像以前那么大肆宣传了,但模板方法模式仍然是解决您所描述的一般问题的一种经过验证的真实方法。

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

【讨论】:

    【解决方案2】:

    这是“正确”的方法。但有一些注意事项:

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

    【讨论】:

      猜你喜欢
      • 2021-07-17
      • 1970-01-01
      • 1970-01-01
      • 2014-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-19
      • 1970-01-01
      相关资源
      最近更新 更多