只有当我在子类中覆盖它时,人们如何才能收集物品?这是代码。如果我取消注释被覆盖的方法,那么我的收藏在公园里有2个人。
public class Park : Thing
{
}
public abstract class Thing
{
public virtual List<Thing> people { get; } = new List<Thing>();
}
public class PersonA : Thing
{
Thing p;
public string Name { get; set; }
public PersonA(Thing p)
{
this.p = p;
Name = "Marry";
this.p.people.Add(this);
}
//public override List<Thing> people => p.people;
}
public class PersonB : Thing
{
Thing p;
public string Name { get; set; }
public PersonB(Thing p)
{
this.p = p;
Name = "Joe";
this.p.people.Add(this);
}
//public override List<Thing> people => p.people;
}
以下是测试应用程序:
Thing park = new Park();
park = new PersonA(park);
park = new PersonB(park);
Console.WriteLine(park.people.Count);
答案 0 :(得分:1)
Thing park = new Park();
在这里,您要实例化Park
对象并将其分配给类型为Thing
的变量。到目前为止,非常好。
park = new PersonA(park);
在这里,您要实例化PersonA
,并且因为您将Park
对象传递给构造函数,构造函数会将自己添加到Park
的{{1}}集合中。所以该集合现在包含一个人。再一次,到目前为止,这么好。
但是,您可以将新的People
对象分配给PersonA
变量。这不是运行时错误,因为变量的类型为park
而Thing
是PersonA
,但这几乎肯定是您的逻辑错误,因为我无法想到你之所以想要一个名为Thing
的变量引用一个人的原因。
关键是,此时park
并未引用park.People
对象的人物集合;它指的是Park
对象的人员集合,这是空的。
PersonA
现在当你调用park = new PersonB(park);
构造函数时,你没有传递PersonB
个对象;您将传递给Park
变量的PersonA
对象传递给它。因此,park
构造函数会将自己添加到PersonB
的{{1}}集合中,该集合现在包含一个人。
但是,您再次将结果分配给PersonA
。所以现在People
包含park
对象,其park
集合为空。这就是为什么:
PersonB
打印零。