具有继承类型的 c# 列表的动态实例
Dynamic instance of c# list with inherited type
案例一:
我有以下情况:我想将动态多态性应用于列表。
我有一个基础class ALayer
public class ALayer {
int Id {get; set;}
}
还有另一个基础 class A 包含层列表
public class A {
List<ALayer> Layers {get; set;}
}
然后我将有几个 classes 从我的基地延伸 classes:
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 Parent Class.
可以编码吗?还是我的设计有缺陷?或者如何根据 class?
的类型实例化我的列表
提前致谢!
已编辑问题
案例二:
在最后一个案例之后,如何将此泛型应用于继承中的中间 class ?假设在 A 和 B
之间存在中间 class
public class Middle:A{
int anyatrr;
}
然后我的 class B 继承自 Middle,但仍然在 B 构造函数中是我要应用动态多态性的地方。
public class B:Middle {
public B(){
this.Layers = new List<BLayer>();
}
}
我如何在中间组合 class 泛型符号加上从 class A
的继承
您可以使用泛型:
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# 泛型的更多信息:https://msdn.microsoft.com/en-us/library/512aeb7t.aspx
更新
案例二
(感谢 X.L.Ant)
就这样吧:
public class Middle<T> : A<T>{ and then public class B : Middle<BLayer> {
案例一: 我有以下情况:我想将动态多态性应用于列表。
我有一个基础class ALayer
public class ALayer {
int Id {get; set;}
}
还有另一个基础 class A 包含层列表
public class A {
List<ALayer> Layers {get; set;}
}
然后我将有几个 classes 从我的基地延伸 classes:
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 Parent Class.
可以编码吗?还是我的设计有缺陷?或者如何根据 class?
的类型实例化我的列表提前致谢!
已编辑问题
案例二: 在最后一个案例之后,如何将此泛型应用于继承中的中间 class ?假设在 A 和 B
之间存在中间 classpublic class Middle:A{
int anyatrr;
}
然后我的 class B 继承自 Middle,但仍然在 B 构造函数中是我要应用动态多态性的地方。
public class B:Middle {
public B(){
this.Layers = new List<BLayer>();
}
}
我如何在中间组合 class 泛型符号加上从 class A
的继承您可以使用泛型:
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# 泛型的更多信息:https://msdn.microsoft.com/en-us/library/512aeb7t.aspx
更新
案例二 (感谢 X.L.Ant)
就这样吧:
public class Middle<T> : A<T>{ and then public class B : Middle<BLayer> {