2017-09-14 67 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所作的陈述恰恰是我的问题的答案。基类是一个编译好的二进制文件,所以没有看它的实现,我假设它每次都使用相同的列表。 –