2016-08-09 9 views
0

サブクラス内でオーバーライドする場合のみ、peopleコレクションに項目が含まれていますか?ここにコードがあります。オーバーライドされたメソッドのコメントを外すと、私のコレクションには公園内に2人の人がいます。ここでC# - なぜ私は空のコレクションを取得していますか?

Thing park = new Park(); 
park = new PersonA(park); 
park = new PersonB(park); 

Console.WriteLine(park.people.Count); 
+2

デバッガを使用してコードをステップ実行すると、どこが間違っているかがわかります。あなたもそれを試してみましたか? – MethodMan

+0

基本クラスに新しいリストがあります。したがって、それを上書きしない限り空になります。デバッグを試みてください。 – AVK

+1

コンストラクタでは、クラス '自身のリストではなくメンバ 'p'のリストに追加します。 'p.people'は' this.people'と同じリストではありません。 Person _has a_ thingを表現しようとしていない限り、 'p'メンバは必要ありません。 – Uueerdo

答えて

1
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オブジェクトはコンストラクタに渡すので、コンストラクタはParkPeopleコレクションに自分自身を追加します。そのコレクションには現在1人の人が含まれています。もう一度、これまでのところ、とても良い。

ただし、新しいPersonAオブジェクトをpark変数に割り当てます。この変数はタイプがThingで、PersonAThingであるため実行時エラーではありませんが、これはほぼ確実にあなたのロジック上のエラーです。parkという変数を参照する理由が考えられません人に。

重要なことは、この時点で、park.Peopleはオブジェクトの人々のコレクションParkを参照していないことです。これは、PersonAオブジェクトの人のコレクションを指します。これは空です。あなたがPersonBコンストラクタを呼び出すとき

park = new PersonB(park); 

さて、あなたはそれをParkオブジェクトを渡していません。 park変数に割り当てたPersonAオブジェクトに渡しています。そのため、コンストラクタはPersonAPeopleコレクションに自分自身を追加します。コレクションには1人の人が含まれています。

また、結果をparkに割り当てています。だからparkにはコレクションが空のPersonBオブジェクトが含まれています。これが理由です:

Console.WriteLine(park.people.Count); 

ゼロを出力します。

+0

便利な歩き回り、ありがとう。あなたの2番目のパラグラフに関しては、デコレータパターンがどのように動作するかです。デコレータをコンポーネントに追加します。最初はちょっと奇妙に見えますが、全体的には意味があり、本当に便利なパターンです。この例は私がはるかに大きなアプリケーションで持っていた単純化された問題です。 – haosmark

+0

@haosmarkしかし、これはあなたの問題の原因となっているようです。私はデコレータのデザインパターンについてはあまりよく分かりませんが、コードを割り当てている理由は分かっています。 –

+0

@Francis Lord nah、コードは働いていませんでした。親のものではありません。これはp.peopleのコメントを外して問題を解決する理由です。 – haosmark

関連する問題