3

次の 2 つのクラスから始めるとします。

public class Foo{   
    public virtual Baz Bar(){
        return GetStandardBaz();
    }
}

public class Qux: Foo{
    public virtual Baz Bar(){
        return GetQuxBaz();
    }
}

ここで、呼び出されBazたときにそれを返す前に、何かを実行する必要があるとします。Barメソッドを作成し、次のようにパブリック メソッドからvirtual protected削除します。virtual

public class Foo{   
    public Baz Bar(){
        var value = BarInternal();
        DoSomethingFirst(value);
        return value;
    }

    protected virtual Baz BarInternal(){
        return GetStandardBaz();
    }
}

public class Qux: Foo{
    protected override Baz BarInternal(){
        return GetQuxBaz();
    }
}

Barこれにより、 get が呼び出されるたびに、返される前に結果Bazが渡されることが保証されます。DoSomethingFirstはい、これはすべての子クラスに対する重大な変更ですが、 の呼び出しサイトを更新する必要はありませんBar

これは標準的なデザインパターンですか?私が行方不明になっているより良い方法はありますか?よりも優れた後置名があるかどうかも疑問に思っていますInternal

4

2 に答える 2

2

Foo次のようにクラスを少し変更すると、 Template Method patternが得られます。

public class Foo{   
    public Baz Bar(){
        var value = BarInternal();
        DoSomethingFirst(value);
        return value;
    }

    protected virtual Baz BarInternal(){
        return GetStandardBaz();
    }
}

Decorator パターンでも同様のことができます。決定は、クラスの目的の詳細によって異なります。

于 2013-07-24T21:05:47.043 に答える
1

入力と出力を標準的な方法でフィルタリングできるので、これは良いことです。検証と追加処理を行うことができます。

入力を検証して、内部/仮想メソッドが特定の条件に依存できるようにすることもできます。

私は通常、接尾辞「コア」(GetBarCore)を使用します。

于 2013-07-24T20:58:58.230 に答える