[英]C# and inheritance. Base class property is null when the object is Extended class object
我有以下课程:
public class BaseContainer
{
public BaseItem item {get; set;}
}
public class ExtendedContainer : BaseContainer
{
new public ExtendedItem item {get; set;}
}
public class BaseItem{
public string Name { get; set; }
}
public class ExtendedItem : BaseItem
{
public string Surname { get; set; }
}
然后我有以下说明:
ExtendedItem ei = new ExtendedItem { Name = "MyName", Surname = "MySurname" };
ExtendedContainer ec = new ExtendedContainer { item = ei };
BaseContainer bc = ec;
string temp = bc.item.Name; // bc.item is null, why?
为什么bc.item为空? 它不应该因为ExtendedItem是BaseItem的子类,但是当我运行代码时它是null。 任何人都可以帮我解决这个问题吗?
我这样做的原因是我使用MVC3并且我传递给部分视图对象/模型是类似结构的一部分,我通常只需要基类中的属性。
提前致谢。
UPDATE
Jon是对的,我正在访问不同的对象。 我做的是修复它是使用构造函数将项属性设置为同一个对象。 像这样:
public class BaseContainer
{
public BaseItem item {get; set;}
public BaseContainer(BaseItem item)
{
this.item = item;
}
}
public class ExtendedContainer : BaseContainer
{
public ExtendedItem item {get; set;}
public ExtendedContainer(ExtendedItem item) : base(item)
{
this.item = item;
}
}
public class BaseItem{
public string Name { get; set; }
}
public class ExtendedItem : BaseItem
{
public string Surname { get; set; }
}
然后我只是创建对象:
ExtendedItem ei = new ExtendedItem { Name = "MyName", Surname = "MySurname" };
ExtendedContainer ec = new ExtendedContainer(ei);
BaseContainer bc = ec;
string temp = bc.item.Name;
它现在有效
您已经使用了new关键字,它隐藏了BaseContainer中的原始基本属性。
实例化ExtendedContainer时,您要在子类上设置新属性,而不是在基类上设置原始属性。
只需从子类中删除该属性,一切都应该工作。
这里有两个完全独立的属性,可以存储不同的值。
您已在对象上设置ExtendedContainer.item
属性,但尚未设置BaseContainer.item
属性。
想象一下,这两个属性有完全不同的名称 - 你不会指望设置一个改变另一个,那么,你呢? 就CLR而言,这两个属性具有名称的事实仅仅是巧合。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.