0

ファクトリメソッドパターンのコードは次のとおりです

public abstract class TestAbstract
{
    public abstract void MainFunc();
}

public class ClassA : TestAbstract
{
    public override void MainFunc()
    {
        //code for line 1
        //code for line 2
        //...
        Func1();
        Func2();
        //code for line 10
    }
    private void Func1() { }
    private void Func2() { }
}
public class ClassB : TestAbstract
{
    public override void MainFunc()
    {
        //code for line 1
        //code for line 2
        //...
        Func1();
        Func2();
        //code for line 10
    }
    private void Func1() { }
    private void Func2() { }
}

現在、ClassA と ClassB の両方の関数 MainFunc には、同じ行がいくつかあります。そして、これらのクラスでコードを繰り返したくありません。MainFunc を TestAbstract クラスに移動しましたが、機能しませんでした。

ここで必要なのは、両方のクラスに対して MainFunc を 1 つだけ持つ方法であり、各クラスで Func1 と Func2 の 2 つの関数を正しく呼び出すことができます。

どうもありがとうございました。

4

5 に答える 5

2

テンプレートメソッドパターンのことですか?私があなたを正しく理解している場合は、以下を試して、サブクラスで Func1 と Func2 をオーバーライドしてください。

public abstract class TestAbstract
{
    public void MainFunc(){ 
        //code for line 1
        //code for line 2
        //...
        Func1();
        Func2();
        //code for line 10
    }

    protected abstract void Func1();
    protected abstract void Func2();
}

MainFunc が Func1 と Func2 を呼び出すには、それらが存在することを知る必要があります。

于 2013-01-17T09:56:41.767 に答える
2

これを「テンプレートメソッドパターン」と呼びます。MainFunc は抽象クラスに存在し、派生クラスに特化したメソッド Func1 および Func2 を呼び出すことができます。

public abstract class TestAbstract
{
    public void MainFunc() 
    { 
        //common code
        Func1();
        Func2(); 
    }

    // you can make these protected instead of public
    // if they are not meant to be called directly outside of your
    // derived classes    
    public abstract void Func1(); 
    public abstract void Func2();
}

public class ClassA : TestAbstract 
{
    public void Func1() 
    { //... logic for ClassA
    }

    public void Func2() 
    { //... logic for ClassA 
    }

}
于 2013-01-17T09:56:47.490 に答える
1

に移動できMainFuncますTestAbstractが、宣言Func1してからFunc2抽象関数として宣言する必要があります。

于 2013-01-17T09:56:16.580 に答える
1

この例では、ClassA は TestAbstract から Func1 と Func2 を実行するだけで、ClassB は関数をオーバーライドします。base.MainFunctionオーバーライドされた MainFunction に追加のコードが必要だったことに注意してください

void Main()
{
    ClassA a = new ClassA();
    a.MainFunc();
}

public class TestAbstract
{
    public virtual void MainFunc()
    {
    Func1();
    Func2();
    }
    public virtual void Func1() { "func1".Dump();}
    public virtual void Func2() { "func2".Dump();}
}

public class ClassA : TestAbstract
{
    public override void MainFunc()
    {
        //code for line 1
        //code for line 2
        //...
 base.MainFunc();
        //code for line 10
    }

}
public class ClassB : TestAbstract
{
    public override void MainFunc()
    {
        //code for line 1
        //code for line 2
        //...
        base.MainFunc();
        //code for line 10
    }
    public override void Func1() { "func1".Dump();}
    public override void Func2() { }
}
于 2013-01-17T10:05:53.410 に答える
0

ロジックを変更する場合、または抽象クラスの単純なものを変更する場合は、 abstractuse virtualfor yourを使用する代わりにMainFuncMainFunc

于 2013-01-17T09:56:32.263 に答える