2017-03-17 12 views
0

私は2つのサブクラスを持つスーパークラスを持っています。サブクラスでメソッドを空にする方法はありますか?

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 
    } 
} 
条件fooがtrueの場合、私は他のサブクラスは何もしないはずですしながら、何らかのアクションを取るために、サブクラスのいずれかをしたいです

この共通の問題に対して、より洗練された、より良い、より標準的な解決策がありますか?

+2

派生クラスで明示的に空の関数が必要ですか?ベースに空の関数があり、必要なサブクラスでのみオーバーライドすることができます – UnholySheep

答えて

6

あなたの説明には名前があります:Template Method patternです。デザインパターンは、かつては一度も過言ではありませんでしたが、Template Methodパターンは、あなたが説明する一般的な種類の問題に対する試行錯誤したアプローチです。

空のdoSomething()メソッドをサブクラスに書き込まないようにするには、代わりに空のdoSomething()メソッドをスーパークラスに配置する方法があります。これは、複数のサブクラス(全体的な心配は2つ以上あると仮定します)に役立ちますが、個人的には、私はちょっと気にしません。非抽象メソッドをオーバーライドすることは、例外ではありませんが、一般的な方法ではありません。

3

これは「正しい」アプローチです。しかし、いくつかの注意事項:サブクラスを防止するために、最終的にあるべき一方

  • doFoo()(あなたは各サブクラスは、特定の実装を提供する必要があることを強制したい場合)

    • doSomethingの()は抽象的かもしれませんその行動を変えることから。
  • 関連する問題