2017-09-14 71 views
-1

在下面的代碼中,我在基類中有一個屬性,它返回自定義對象的列表。在父類中,我覆蓋了這個屬性,並且在覆蓋的定義中,我從基類訪問對自定義對象列表的引用,並向其中添加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

聽起來base.TestProperty返回'新列表()'。 –

+0

您尚未提供足夠的代碼來重現您描述的問題。 – Servy

回答

0

這並不是你要找的具體答案,但是......你應該真的重新考慮你的設計。

你在你的子類中有一個屬性...和獲得該屬性會改變你的類的值。那是極端違反直覺。它不象你所期望的:

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

...那第二語句變化只是通過訪問它的一個屬性值的變量!如果在運行第二條語句時將bgCol的內容更改爲黃色,會有多混淆?

我的建議是?讓基類返回它應該做的 - 忘記子類。如果你的子類需要增加值的結果?然後讓它在調用子類的屬性時添加值 - ,但僅限於返回的結果 - 不要混淆基礎對象的屬性。

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所作的陳述恰恰是我的問題的答案。基類是一個編譯好的二進制文件,所以沒有看它的實現,我假設它每次都使用相同的列表。 –