将父类强制转换为子类

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

class ChildMessage: Message { prop... } 

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

 var myChildList =new List (); var myParentClass = new Message(); myChildList.add(myParentClass as ChildMessage) myChildList[0] == null //Always return null 

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

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

除非myParentClass 实际上是使用ChildMessage实例化的, 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; } } 

然后通过ChildMessage类公开Message或其属性。

第二选择

这是可行的,inheritance自Message ,但是当你想从Message创建一个ChildMessage时你需要转换它 ,而不是转换它:

 class ChildMessage : Message { public ChildMessage(Message m) { // Instantiate properties by copying from m } } 

我认为你以某种方式得到了错误的方式 – 通常你可能想要这样的东西:

 var myList =new List (); var myChildObject = new ChildMessage(); myList.add(myChildObject) myList[0] as ChildMessage == null // should not return null 

如果以这种方式更改代码

 var myChildList =new List (); var myChildClass = new ChildMessage(); myChildList.add(myChildClass as Message) 

现在您有一个List,其中对象的类型为ChildMessage,或者是从Message派生的其他类型。 您可以在以后使用列表中存储的对象时检查正确的类型。

对象上的强制转换不能用于更改其类型:它不是转换 。 它只用于告诉对象的类型:您解释说您希望将该对象用作该类型的对象; 并且该对象必须已经是该类型,否则您将收到错误(至少在一个像C#这样的体面语言中)。

转换对象很有意义,因为由于inheritance,对象可能同时具有多种类型。

在您的代码中,每个ChildMessage都是一个Message ,但您创建的Message不是ChildMessage ,因此尝试使用它们会失败。

相比之下,从整数到实数的“强制转换”,反之亦然,实际上可能是转换。 (IT术语是一个绝望的丛林。)