我有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

也就是说,在类型上可以使用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;
    }
}

然后,您可以通过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/

10-11 22:44