案例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类继承
答案 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> {