2017-09-14 1 views
-1

以下のコードでは、カスタムオブジェクトのリストを返すベースクラスのプロパティがあります。親クラスではこのプロパティをオーバーライドし、オーバーライドの定義では、基本クラスのカスタムオブジェクトのリストへの参照にアクセスし、2つのオブジェクトを追加します。ベースプロパティのオーバーライドとベースでの参照へのアクセス

戻る前にコードにブレークポイントを置き、ベースプロパティの内容をチェックして、2つの新しいオブジェクトがそこにないことに気付きます。次に、基本クラスのオブジェクトのリストへの参照をローカルに格納しようとし、リストに2つのオブジェクトを再度追加しました。私はローカルリファレンスで2つの新しいオブジェクトが追加されていることに気付きました。

しかし、私は同じ参照を指しているので、私はbase.TestPropertyを参照してオブジェクトを追加できるはずです。それがうまくいかない理由は何ですか?

public override List<CustomObject> TestProperty 
{ 
    get 
    { 
     List<CustomObject> temp = base.TestProperty; 

     CustomObject obj1 = new CustomObject() 
     { 
      Name = "My Name" 
     }; 

     CustomObject obj2 = new CustomObject() 
     { 
      Name = "Your Name" 
     }; 

    // Adding to the base list 
     base.TestProperty.Add(obj1); 
     base.TestProperty.Add(obj2); 

    // Adding to temp list, which still points to the base list 
     temp.Add(obj1); 
     temp.Add(obj2); 

    // Base object doesnot contain obj1 and obj2, but the temp object does. 
     return base.TestProperty; 
    } 
} 
+3

実装base.TestPropertyは '新しいリストを()'を返すようにplsは – Will

+3

が鳴ります。 –

+0

説明した問題を再現するのに十分なコードが提供されていません。 – Servy

答えて

0

これは実際にあなたが探している特定の答えではありませんが、実際にはデザインを再考する必要があります。

あなたのサブクラスにはプロパティがあります。にはというプロパティがクラスの値を変更します。それは極端にです。あなたが期待するようではない:

Color bgCol = Color.Red; 
int red = bgCol.R; 

... 変化に、第2の文がちょうどそのプロパティの1つにアクセスして、変数の値!その2番目のステートメントを実行すると、bgColの内容が黄色に変更された場合、どのように混乱しますか?

私のアドバイスはありますか?基本クラスに、それが想定していたものを返すようにします。つまり、サブクラスを忘れることです。あなたのサブクラスがその結果に値を追加する必要がある場合は?次に、サブクラスのプロパティが-と呼び出されたときに値を追加するようにしましたが、結果が返されるのはです。ベースオブジェクトのプロパティを全く混乱させることはありません。 base.TestPropertyの

public override List<CustomObject> TestProperty 
{ 
    get 
    { 
     List<CustomObject> objectsFromBase = base.TestProperty; 
     List<CustomObject> objectsFromThisClass = GetMySubclassCustomObjects(); 
     List<CustomObject> retVal = new List<CustomObject>(); 
     retVal.AddRange(objectsFromBase); 
     retVal.AddRange(objectsFromSubclass); 
     return retVal; 
    } 
} 
private List<CustomObject> GetMySubclassCustomObjects() 
{ 
    // your code for those two CustomObjects, and returning them from a list 
} 
+0

あなたの説明をお寄せいただきありがとうございますが、Ed Plunkettが作成した声明はまさに私の質問に対する答えです。基本クラスはコンパイルされたバイナリになっていますので、毎回同じリストを使用していると見なして実装を見ていません。 –

関連する問題