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; }
    }
}

我在构造函数中传递的参数将是孩子之一。有没有办法通过 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; }
    }
}

但是,这里有一个警告。你需要知道传入的实例parent是 typeChild1,否则什么都不会发生。一般来说,如果/则涵盖所有可能的子类被认为是一个糟糕的设计,因为这意味着当您将来添加另一个子类时,您需要记住回到这里并将其添加到 if/then .

正确的方法是在 Parent 中有一个在 child 中被覆盖的属性:

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

看起来您可能想要使用Interfacegenerics

于 2012-06-13T18:46:32.760 回答