在下面的代码中,我在基类中有一个属性,它返回一个自定义对象列表。在父类中,我重写了这个属性,在覆盖的定义中,我从基类访问自定义对象列表的引用,并向其中添加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;
}
}
答案 0 :(得分: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
}