将父类强制转换为子类
我有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
。
也就是说,可以在类型上使用implicit
和explicit
运算符,因此您可以创建一个接收Message
并输出ChildMessage
。
https://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术语是一个绝望的丛林。)
上述就是C#学习教程:将父类强制转换为子类分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/997150.html