1

abstract base class他のクラス X から継承し ているA があるとします。

クラス A オーバーライド メソッドfoo1

クラスである他のいくつかのクラスA1、A2、A3がありconcreteます。

すべての具象クラスは method を継承しfoo1ます。

メソッドfoo1は、すべての具体的なクラスに適しているはずの一般的なアルゴリズムのようなものです。
アルゴリズムの1つの例外がif条件があるため、「ほぼ」です。一部のクラスでfoo2は、の開始時に他のメソッドを起動する必要があるのはA1、A3だけですfoo

A2 の場合、起動する必要はありませんfoo2

問題はfoo2、クラス A に実装すると、すべての子がこの関数も継承することです。これはあまり良い設計ではありませんか?

foo2具体的なクラスによって実装されるインターフェイスに除外することを考えました->しかし、foo1どの呼び出しfoo2が基本クラスにあるのか、これは良くありません!

この問題を適切な方法で解決する方法はありますか?

ありがとうございました

4

3 に答える 3

2

子クラスでオーバーライドできる、ある種の内部 Foo1 初期化子を持つことができます。

public abstract class A {
    internal virtual void Foo1Init() {
        Console.WriteLine("Foo1Init");
    }

    public void Foo1() {
        Foo1Init();
        Console.WriteLine("Foo1");
    }
}

public class A1 : A {
    internal override void Foo1Init() {
        Console.WriteLine("A1 Foo1Init Override");
    }
}

public class A2 : A {

}

public class A3 : A {
    internal override void Foo1Init() {
        Console.WriteLine("A3 Foo1Init Override");
    }
}

class Program {
    static void Main(string[] args) {
        var a1 = new A1();
        a1.Foo1();

        var a2 = new A2();
        a2.Foo1();

        var a3 = new A3();
        a3.Foo1();

        Console.ReadKey();
    }
}

出力:

A1 Foo1Init オーバーライド  
ふー1  
Foo1Init
ふー1
A3 Foo1Init オーバーライド  
ふー1
于 2013-07-31T21:28:28.137 に答える
0

サブクラスが foo2() を呼び出す必要があるときに設定できる基本クラスにプロパティを作成します。

public class BaseClass {
    protected bool RunFoo2 { get; set; }

    public BaseClass() {
        // Not really needed, since booleans default to false
        RunFoo2 = false;
    }

    public virtual void foo1() {
        if (RunFoo2)
            foo2();
        // Default code here
    }

    public virtual void foo2() {
        // Whatever
    }
}

public class A : BaseClass {
    public A() : base() {
        RunFoo2 = true;
    }
}
于 2013-07-31T21:26:44.530 に答える