0

共通のメンバー変数とメソッドをリファクタリングして抽象化しようとしているクラスがたくさんあります。

すべてのクラスで目にするメソッドの 1 つは、MethodFoo() というメソッドです。このメソッドには共通の本体がありますが、各クラスにはさらに何かが追加されています..たとえば、あるクラスの場合は次のようになります。

private method MethodFoo()
{

   // common stuff ...// wow! a Goto Statement ..seriously!  //1

   **// NON-common stuff just for the method of this class**  //2

   Goto: // bunch of COMMON stuff again   //3
}

したがって、テンプレートは常に、パート1と3は異なるクラスのこのメソッドと同じですが、eaxchクラスでの違いはパート2です...そして、醜いgotoステートメントも忘れないでください:)

この図を念頭に置いて、この一部を抽象クラスに入れる方法はあると思いますか?

4

4 に答える 4

7

あなたの基本クラスで:

private method MethodFoo()
{

   // common stuff ...// wow! a Goto Statement ..seriously!  //1

   DoExtraStuff();

   Goto: // bunch of COMMON stuff again   //3
}

protected abstract void DoExtraStuff();

このようにして、すべての継承クラスに実装する必要があります。DoExtraStuff

このパターンは、テンプレート メソッド デザイン パターンと呼ばれます。

于 2012-09-06T15:24:04.890 に答える
3

Template Method Patternについて説明しています。

実装者は and を処理しDetailStepますがToDo、すべてに共通です。

public abstract class Parent
{
    public void ToDo()
    {
        Pre();

        DetailStep();

        Post();
    }

    protected abstract void DetailStep();
}
于 2012-09-06T15:24:47.217 に答える
3

これは、「テンプレート メソッド」パターンを使用して解決できます。ここで「フォーム A」を参照してください。

非仮想メソッドと抽象メソッドの命名規則

すべての MethodFoo をリファクタリングして、共通のものを基本クラスに「プルアップ」できます。基本クラスにメソッド「保護された仮想 MethodFooInternal」を追加します (上記の例の「WalkInternal」に似ています)。派生クラスは、一般的でないものを MethodFooInternal に実装します。

GOTO をなくすには、基本クラスに条件付きロジックを作成して、MethodFooInternal を呼び出すかどうかを決定します。

private method MethodFoo()
{

   // common stuff ...// wow! no more Goto Statement   //1

    if (this.needToExecuteNonCommonStuff()) {
       **// NON-common stuff just for the method of this class**  //2
        MethodFooInternal();
    }

   // bunch of COMMON stuff again   //3
}

protected abstract void MethodFooInternal();
}
于 2012-09-06T16:07:48.297 に答える
1

これを保護されたメソッドにすると、派生クラスはそれをオーバーライドして基本実装を呼び出すことができます。

protected override void MethodFoo()
{

  base.MethodFood();

   **// NON-common stuff just for the method of this class**  //2
}

もちろん、これには、派生クラスでステップを実行する必要がある順序を知る必要があります。より良いアプローチは、Austin Salonen または Oded によって提供された回答を使用することです。

于 2012-09-06T15:24:48.473 に答える