访问继承类型中的新版本的属性/方法

时间:2016-05-27 06:31:49

标签: c# polymorphism

我有两节课。 ClassA使用ClassB。我希望能够存储任何ClassB对象的List(即ClassB,ClassB都在同一个列表中)。

我已经实现了这样(简化):

ClassB
{
    public object Thing {get; set;}
    AssignThing(object thing) {Thing = thing;}
}

ClassB<T> : ClassB
{ 
    ... 
}

ClassA
{
    public List<ClassB> list {get; set;}
    ...
}

但是,我希望ClassB能够将Thing作为其原生类型T存储,基于T是什么,同时仍然能够从列表中访问Class A中的T Thing和T AssignThing,而无需将其转换为各自的ClassB。我最初为ClassB尝试了以下实现:

ClassB<T> : ClassB
{
    public new T Thing {get; set;}
    AssignThing(T thing) {Thing = thing;}
}

然而,当我从ClassA访问Thing时,它会(通过快速监视)显示ClassB的Thing版本,而不是ClassB<T>和{{1} }也使用AssignThing的版本。显然,我不能覆盖(而不是新)因为它们是不同的签名。

似乎我对继承/多态性有点模糊。我正在尝试用C#做什么?

1 个答案:

答案 0 :(得分:0)

您需要制作ClassB列表,而不仅仅是ClassB。

class ClassB
{
    private object Thing {get; set;}
    public void AssignThing(object thing) {Thing = thing;}
}

class ClassB<T>:ClassB
{
    private T Thing { get; set; }
    public void AssignThing(T thing) { Thing = thing; }
}

class ClassA
{
    public List<ClassB<String>> list = new List<ClassB<String>>();
    public ClassA()
    {
        list.Add(new ClassB<String>());
        //Here you only can add ClassB<String>, not ClassB
    }
}

另一种选择是将它们命名为diferend。如果您不需要它们具有相同的名称,只需调用类似GenClassB的ClassB