C# - 为什么我得到一个空集合?

时间:2016-08-09 20:18:11

标签: c# decorator

只有当我在子类中覆盖它时,人们如何才能收集物品?这是代码。如果我取消注释被覆盖的方法,那么我的收藏在公园里有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);

1 个答案:

答案 0 :(得分:1)

Thing park = new Park();

在这里,您要实例化Park对象并将其分配给类型为Thing的变量。到目前为止,非常好。

park = new PersonA(park);

在这里,您要实例化PersonA,并且因为您将Park对象传递给构造函数,构造函数会将自己添加到Park的{​​{1}}集合中。所以该集合现在包含一个人。再一次,到目前为止,这么好。

但是,您可以将新的People对象分配给PersonA变量。这不是运行时错误,因为变量的类型为parkThingPersonA,但这几乎肯定是您的逻辑错误,因为我无法想到你之所以想要一个名为Thing的变量引用一个人的原因。

关键是,此时park并未引用park.People对象的人物集合;它指的是Park对象的人员集合,这是空的。

PersonA

现在当你调用park = new PersonB(park); 构造函数时,你没有传递PersonB个对象;您将传递给Park变量的PersonA对象传递给它。因此,park构造函数会将自己添加到PersonB的{​​{1}}集合中,该集合现在包含一个人。

但是,您再次将结果分配给PersonA。所以现在People包含park对象,其park集合为空。这就是为什么:

PersonB

打印零。