覆盖Base属性并在Base中访问引用

时间:2017-09-14 16:55:18

标签: c# list reference override base

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

1 个答案:

答案 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
}