找到这个问题的正确单词我遇到了麻烦,所以我会尝试用一些代码向你展示我的问题。
我有一个父类,如下所示:
public class ParentClass {
public Guid ParentId { get; }
public int ParentProperty { get; set; }
public List<ParentClass> ParentList { get; set; }
public ParentClass() {
this.ParentId = Guid.NewGuid();
}
}
这很简单:它有一个ID,一些属性和一个包含自身元素的List。
现在我正在创建一个子类,如下所示:
public class ChildClass : ParentClass {
public string ChildProperty { get; set; }
public ChildClass() : base() {
this.ParentList = new List<ChildClass>();
}
}
这个有一个额外的属性和一个包含问题的构造函数。我无法在List的声明中发起List。 我不能只在子类中声明列表,因为我在使用它时需要它在父类中。
解决此问题的最佳方法是什么?
答案 0 :(得分:5)
您应该使用指向两个类(ParentClass
以及ChildClass
)的接口。
具有特定类型参数的泛型类型是&#34; new&#34;类型:List<ChildClass>
和List<ParentClass>
是不同的类型。
答案 1 :(得分:1)
我认为实现目标的最简单方法是使用其基本类型启动列表:List<ParentClass>
public class ChildClass : ParentClass
{
public string ChildProperty { get; set; }
public ChildClass() : base() {
this.ParentList = new List<ParentClass>();
}
public void AddSomething()
{
// this is ok :
this.ParentList.Add(new ChildClass());
}
}
答案 2 :(得分:1)
仅当List<T>
中的T
类型具有协变性时,这种方法才有效,也称为“out T
”。但是,它不是,也不可能。
List<>
允许Add
,Insert
和其他类型,因此它不具有语义协变性。class
类型无法变为协变。那是不支持的。只有interface
和delegate
类型可以在其通用参数中变为协变(或逆变)。我们得到的最接近的是IReadOnlyList<out T>
,它是协变的,所以:
IReadOnlyList<ParentClass> parentList = new List<ChildClass>();
是允许的。但是,在您的情况下无效。
答案 3 :(得分:0)
public class ParentClass<TChild> where TChild : class
{
public List<TChild> ParentList { get; set; }
public Guid ParentId { get; set; }
public int ParentProperty { get; set; }
public ParentClass()
{
ParentId = Guid.NewGuid();
ParentList = new List<TChild>();
}
}
public class ChildClass : ParentClass<ChildClass>
{
public string ChildProperty { get; set; }
}