好的,这可能是用严格类型的编程语言提出的另一个愚蠢的问题,但是...
public class Parent
{
public List<Parent> list_of = new List<Parent>;
}
public class Child : Parent
{
public List<Child> list_of = new List<Child>;
}
基本上,我要问的是,是否可以在子类中更改列表的“内容”类型?
答案 0 :(得分:1)
基本上没有。关于覆盖:
virtual
属性或函数但是您可以使用new
关键字隐藏字段/属性/功能并更改类型:
public class Parent
{
public List<Parent> ListOf = new List<Parent>();
}
public class Child : Parent
{
public new List<Child> ListOf = new List<Child>();
}
这不是覆盖,您仍然可以访问Parent
的{{1}}字段,但前提是您将ListOf
强制转换为Child
。
此外,应该提及的是,只有Parent
类型是协变的(声明为ISomeGeneric<Child>
),才可以将ISomeGeneric<Parent>
类型视为ISomeGeneric<out T>
类型。 List<T>
不是协变(here's why),因此List<Child>
不能被视为List<Parent>
,这是两种不同的类型。
但是IEnumerable<T>
是协变的,因此您可以将ListOf
设置为属性,将其类型更改为IEnumerable<Parent>
,并在派生类中使用IEnumerable<Child>
对其进行实例化:
public class Parent
{
public virtual IEnumerable<Parent> ListOf { get; set; } = new List<Parent>();
}
public class Child : Parent
{
public override IEnumerable<Parent> ListOf { get; set; } = new List<Child>();
}
但即使在覆盖时,也无法将属性类型IEnumerable<Parent>
更改为IEnumerable<Child>
。