3

このような抽象クラスがあります

public abstract Stuff
{
    public abstract void doStuff();
}

いくつかのクラスは、doStuff() をオーバーライドして Stuff を拡張しています。通常、doStuff() は実装ごとにまったく異なるタスクを実行しますが、共通部分を共有しています。

これを実装する最良の方法は何ですか?

私は次のようなものを書きたくありません:

public void doStuff()
{
    doTheCommonPart();
    ...
}

すべての拡張クラスで。

4

3 に答える 3

6

テンプレートメソッドパターンを使用できます:

public abstract Stuff
{
    public abstract void doStuff();

    public void doTheCommonPart() {
      // ...
    }

    // Template method
    public final void doIt() {
      doTheCommonPart();
      doStuff();
    }
}

次に、クライアントクラスはテンプレートメソッドを呼び出すだけdoIt()です。共通コード部分と、抽象メソッドの具体的な実装を実行しdoStuff()ます。

于 2012-09-16T15:50:56.910 に答える
5

また:

  1. 共通コードをクラスのprotectedメソッドに配置し、 のStuff各実装から呼び出しdoStuffます。また

  2. 共通コードを抽象Stuffクラスに追加し、別の抽象メソッドを呼び出します。

例 (1)

public abstract Stuff  
{
    public abstract void doStuff();

    protected void commonCode() 
    {
      //...
    }
}

または (2)

public abstract Stuff
{
    public void doStuff() 
    {
      // Do the common stuff initially...
      // ...

      // Then call the subclass implementation
      doRealStuff();
    }

    public abstract void doRealStuff();
}
于 2012-09-16T15:54:09.010 に答える
2

テンプレートメソッドのデザインパターンに似た、次のように定義できます。

public abstract Stuff
{
    public abstract void doSpecificStuff();

    public void doStuff()
    {
        doCommonStuff();
        doSpecificStuff();
    }
}
于 2012-09-16T15:51:37.860 に答える