4

プログラミングパターンが必要ですが、それがどうなるかわかりませんでした。私が望むことが可能かどうかさえわかりません。Class Aから継承された と 10 クラスがあるとしましょうA。私が望むのは、Method Print()継承された各クラスで異なる方法で実装された同じメソッドを呼び出すことですが、それらはすべて の同じメソッドを繰り返す必要がありClass Aます。

Class A
{
    public virtual void Print()
    { 
    }
    protected void StartingProcedure()
    {
        /// something 
    }
    protected void EndingProcedure()
    {
        /// something 
    }
}

Class A_1 : A
{
    public override void Print()
    {
        StartingProcedure();
        /// class specific print operation
        EndingProcedure();
    }
}

Class A_2 : A
{
    public override void Print()
    {
        StartingProcedure();
        /// class specific print operation
        EndingProcedure();
    }
}

StartingProcedure();ご覧のとおり、オーバーライドされた各Printメソッドについて書き続けたくありません。その手順を自動化したいのですが、から新しいクラスを継承するときにA、開始手順と終了手順を気にしたくないので、クラス固有の印刷操作を書きたいだけです。この種のクラスの動作を提供するパターンはありますか?

ところで、私はC#で作業しています

4

3 に答える 3

9
Class A
{
    public void Print()
    { 
        StartingProcedure();
        SpecificPrint();
        EndingProcedure();
    }
    protected void StartingProcedure()
    {
        /// something 
    }
    protected void EndingProcedure()
    {
        /// something 
    }
    protected virtual SpecificPrint() // could possibly be abstract
    {
    }
}

Class A_1 : A
{
    public override void SpecificPrint()
    {
        /// class specific print operation
    }
}

Class A_2 : A
{
    public override void SpecificPrint()
    {
        /// class specific print operation
    }
}
于 2013-11-13T14:19:37.667 に答える
3

この場合に探しているパターンは、Gang of Four (GoF) によるテンプレート パターンです。

Class A
{
    public virtual void Print()
    { 
    }
    protected void StartingProcedure()
    {
        /// something 
        Print();
    }
    protected void EndingProcedure()
    {
        /// something 
    }
}

通常は、 Template Methodと呼ばれる別のメソッドを追加します。

/// Template Method
protected void Run()
{
    StartingProcedure();
    Print();
    EndingProcedure();
}

class A_1 : A
{
    public override void Print()
    {
        /// class specific print operation
    }
    public A_1()
    {
       base.Run();
    }
}
于 2013-11-13T14:18:40.727 に答える
1

Rikの答えの代わりに、クラス階層を変更でき、派生メソッドで基本メソッドを本当に呼び出したくない場合は、継承の代わりに構成を使用してこれを実現できます。デコレータ パターンを使用すると、派生関数をラップする print メソッドを指定できます。

class PrintDecorator : A
{
    private A wrappedA;
    public PrintDecorator(A a)
    {
        wrappedA = a;
    }
    public virtual void Print()
    {
        //wrap the derived logic with the pre- and post- processing
        StartingProcedure();
        wrappedA.Print();
        EndingProcedure();
    }
}
class A
{
    public virtual void Print()
    { 
    }
    protected void StartingProcedure()
    {
        /// something 
    }
    protected void EndingProcedure()
    {
        /// something 
    }
}

class A_1 : A
{
    public override void Print()
    {
        /// class specific print operation
    }
}

class A_2 : A
{
    public override void Print()
    {
        /// class specific print operation
    }
}

使用例:

A dec = new PrintDecorator(new A_1());
dec.Print();
于 2013-11-13T14:25:29.520 に答える