Thing park = new Park();
あなたがPark
オブジェクトをインスタンス化し、そのタイプThing
ある変数に代入されます。
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;
}
そしてここでは、テストアプリケーションです。ここまでは順調ですね。
park = new PersonA(park);
ここでは、PersonA
をインスタンス化している、とあなたはPark
オブジェクトはコンストラクタに渡すので、コンストラクタはPark
のPeople
コレクションに自分自身を追加します。そのコレクションには現在1人の人が含まれています。もう一度、これまでのところ、とても良い。
ただし、新しいPersonA
オブジェクトをpark
変数に割り当てます。この変数はタイプがThing
で、PersonA
がThing
であるため実行時エラーではありませんが、これはほぼ確実にあなたのロジック上のエラーです。park
という変数を参照する理由が考えられません人に。
重要なことは、この時点で、park.People
はオブジェクトの人々のコレクションPark
を参照していないことです。これは、PersonA
オブジェクトの人のコレクションを指します。これは空です。あなたがPersonB
コンストラクタを呼び出すとき
park = new PersonB(park);
さて、あなたはそれをPark
オブジェクトを渡していません。 park
変数に割り当てたPersonA
オブジェクトに渡しています。そのため、コンストラクタはPersonA
のPeople
コレクションに自分自身を追加します。コレクションには1人の人が含まれています。
また、結果をpark
に割り当てています。だからpark
にはコレクションが空のPersonB
オブジェクトが含まれています。これが理由です:
Console.WriteLine(park.people.Count);
ゼロを出力します。
デバッガを使用してコードをステップ実行すると、どこが間違っているかがわかります。あなたもそれを試してみましたか? – MethodMan
基本クラスに新しいリストがあります。したがって、それを上書きしない限り空になります。デバッグを試みてください。 –
AVK
コンストラクタでは、クラス '自身のリストではなくメンバ 'p'のリストに追加します。 'p.people'は' this.people'と同じリストではありません。 Person _has a_ thingを表現しようとしていない限り、 'p'メンバは必要ありません。 – Uueerdo