具有继承类型的c#list的动态实例

时间:2015-02-19 15:25:23

标签: c# list inheritance dynamic polymorphism

案例1: 我有以下情况:我想将动态多态应用于List。

我有一个基类ALayer

public class ALayer {
   int Id {get; set;}
}

另一个包含图层列表的基类A

public class A {
   List<ALayer> Layers {get; set;}
}

然后我会有几个从我的基类扩展的类:

public class BLayer: Alayer {
   int blayerattr {get; set;}
}

public class B:A {
   //I want to apply the polymorphism in the constructor
   public B(){
     this.Layers = new List<BLayer>();//error
   }
}

public class CLayer: Alayer {
   int clayerattr {get; set;}
}

public class C:A {
   //I want to apply the polymorphism in the constructor
   public C(){
      this.Layers = new List<CLayer>();//error
   }

}

但编译器给出了一个错误,即无法将子层隐式转换为父层。子层是完全不同的,所以我决定创建ALayer父类。

可以编码吗?或者我的设计有缺陷?或者我如何根据班级的类型实例化我的列表?

提前谢谢!

编辑问题

案例2: 在最后一个案例之后,如何将此泛型应用于继承中的中间类?假设在A和B之间存在一个中产阶级

public class Middle:A{
   int   anyatrr;
}

然后我的B类继承自Middle,但仍然在B构造函数中我想应用动态多态。

public class B:Middle {       
   public B(){
     this.Layers = new List<BLayer>();
   }
}

如何在中产阶级中结合泛型符号和A类继承

1 个答案:

答案 0 :(得分:2)

您可以使用泛型:

public abstract class ALayer
{
    int Id { get; set; }
}

public abstract class A<T> where T : ALayer
{
    protected List<T> Layers { get; set; }
}

public class B : A<BLayer>
{
    //I want to apply the polymorphism in the constructor
    public B()
    {
        this.Layers = new List<BLayer>();
    }
}

public class BLayer : ALayer
{
    int blayerattr { get; set; }
}

您可以在此处获取有关C#generics的更多信息:https://msdn.microsoft.com/en-us/library/512aeb7t.aspx

<强>更新

案例2 (致X.L.Ant的信用)

只是做:

public class Middle<T> : A<T>{ and then public class B : Middle<BLayer> {