我有Message类,已经扩展并添加了新属性。
class ChildMessage: Message
{
prop...
}
尝试将Message Class添加到ChildMessage列表时,我获得添加类的Null引用。
var myChildList =new List<ChildMessage> ();
var myParentClass = new Message();
myChildList.add(myParentClass as ChildMessage)
myChildList[0] == null //Always return null
我的代码有什么问题?有哪些选择?
最佳答案
这是因为Message
的真实实例不是ChildMessage
,而ChildMessage
的实例是Message
。
除非myParentClass
实际上是使用ChildMessage
实例化的,否则您不能使用强制转换运算符强制进行前向强制转换,因为实际的基础类型是Message
。
也就是说,在类型上可以使用implicit
和explicit
强制转换运算符,因此您可以创建一个接受Message
并输出ChildMessage
的运算符。
http://msdn.microsoft.com/en-us/library/85w54y0a.aspx
知道为您提供了这些类型,并且别无选择,只能使用它们,您有两个选择可以扩展该类型。
第一个选项
使用装饰器/包装器模式将Message
包装在ChildMessage
中:
class ChildMessage
{
private Message _innerMessage;
public ChildMessage(Message innerMessage)
{
_innerMessage = innerMessage;
}
}
然后,您可以通过
Message
类公开ChildMessage
或其属性。第二个选项
这是可行的,继承自
Message
,但是当您想从ChildMessage
生成Message
时,将需要对其进行转换,而不是对其进行强制转换:class ChildMessage : Message
{
public ChildMessage(Message m)
{
// Instantiate properties by copying from m
}
}
关于c# - 将父类转换为子类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9598381/