将父类强制转换为子类

Tom*_*mas 5 .net c# casting

我有Message类,我已经扩展并添加了新属性.

class ChildMessage: Message 
{
prop...
}
Run Code Online (Sandbox Code Playgroud)

在尝试将Message Class添加到ChildMessage列表时,我获得了添加类的Null引用.

var myChildList =new List<ChildMessage> ();
var myParentClass = new Message();
myChildList.add(myParentClass as ChildMessage)

myChildList[0] == null //Always return null 
Run Code Online (Sandbox Code Playgroud)

我的代码出了什么问题?有哪些替代方案?

Ada*_*rth 18

这是因为真实的实例Message不是a ChildMessage,而实例ChildMessage是a Message.

除非myParentClass实际实例化ChildMessage你不能使用强制转换运算符,迫使向前塑像作为实际的基础类型Message.

也就是说,可以在类型上使用implicitexplicit构建运算符,因此您可以创建一个可以Message输出和输出的运算符ChildMessage.

http://msdn.microsoft.com/en-us/library/85w54y0a.aspx


知道你有这些类型,你别无选择,只能使用它们,你有两个选择,以扩展该类型.

第一选择

使用装饰器/包装器模式包装Message内部ChildMessage:

class ChildMessage
{
    private Message _innerMessage;

    public ChildMessage(Message innerMessage)
    {
        _innerMessage = innerMessage;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后Message通过ChildMessage类公开它或它的属性.

第二选择

这是可行的,继承自Message,但是当你想要制作a时ChildMessage,Message你需要转换它,而不是转换它:

class ChildMessage : Message
{
    public ChildMessage(Message m)
    {
        // Instantiate properties by copying from m
    }
}
Run Code Online (Sandbox Code Playgroud)