0

次のようなクラス階層(.Net 3.5)があります。

Parent
   - Child1
   - Child2
   - Child3

次のような基本クラスがあります。

public abstract class BaseClass
{
    protected Parent field;

    public BaseClass(Parent someField)
    {
        this.field = someField
    }

    public string Property1
    {
        get { return field.Child1Property; }
        set { field.Child1Property = value; }
    }
}

コンストラクターで渡すパラメーターは、Children の 1 つになります。Parent 型の変数を介して Child プロパティにアクセスする方法はありますか?

または、これを行うことは可能ですか:

public abstract class BaseClass
{
    protected Parent field;
    protected Type childType; //Type? Or something else?

    public BaseClass(Parent someField)
    {
        //assign the runtime type of someField to childType
        this.field = someField
    }

    public string Property1
    {
        get { return ((childType)field).Child1Property; }  //Is this possible?
        set { ((childType)field).Child1Property = value; }
    }
}

Type を使用すると、 ((childType)field).Child1Property が許可されていないため、機能しないようです。問題は、実行時にどのタイプの子が渡されているかしかわからないため、フィールドを適切なタイプにキャストできないように見えることです。

ヘルプ!

4

2 に答える 2

4

あなたはこれを行うことができます:

public abstract class BaseClass
{
    protected Parent field;

    public BaseClass(Parent someField)
    {
        this.field = someField
        if (someField is Child1)
            this.Property1 = ((Child1)someField).Foo();
    }

    public Int32 Property1
    {
        get { return field.Child1Property; }
        set { field.Child1Property = value; }
    }
}

ただし、ここには注意点があります。渡されるインスタンスがタイプであることを知っておく必要があり。そうしないと、何も起こりません。一般に、考えられるすべての子クラスをカバーするif / thenを使用することは悪い設計と見なされます。これは、将来別の子を追加するときに、ここに戻ってif/thenに追加することを忘れないでください。 。parentChild1

これを行う適切な方法は、実際には、子でオーバーライドされるプロパティを親に持つことです。

public class Parent {
    public virtual Int32 Foo() { return 5; }
}

public class Child1 : Parent {
    public override Int32 Foo() { return 7; } 
}

そして、そのプロパティを使用します。

    public BaseClass(Parent someField)
    {
        this.field = someField

        // If someField happens to be a Child1, this will be 7
        this.Property1 = someField.Foo();
    }
于 2012-06-13T18:47:43.323 に答える
3

インターフェイスまたはジェネリックを使用したいようです。

于 2012-06-13T18:46:32.760 に答える