将继承类的对象转换为继承类型的实例
Posted
技术标签:
【中文标题】将继承类的对象转换为继承类型的实例【英文标题】:Casting object of inherited class to instance of inheriting type 【发布时间】:2021-12-27 20:59:25 【问题描述】:我有以下代码。
class Program
static void Main(string[] args)
Outer outer = new Outer();
Inner inner = new Inner();
Outer outer2 = new Inner();
Inner inner2 = new Outer();
public class Outer
public class Inner : Outer
将new Outer()
分配给inner2
时出现编译器错误,因为它的类型为Inner
。我知道这与继承有关,但我不知道为什么,因为内容相同。另外,我怎样才能强制它被转换为Inner
。
我试过了
(inner)new Outer();
new Outer() as Inner;
但它在前者中抛出了关于转换的异常,在后者中变为 null。不知道用谷歌搜索什么。我的意思是像 this 但恰恰相反。
【问题讨论】:
Outer 不是 Inner,当它不是 Inner 时,你永远不能强迫它成为 Inner。内容无关紧要。 如果您将事物命名为Base
和 Sub
,顺便说一句,这会容易得多。 Outer
类型的变量可以引用 Outer
的实例或 Outer
的任何子类的实例(在本例中为 Inner
)。但是,Inner
是Outer
的特化,因此Inner
的变量只能引用Inner
对象(或Inner
的任何子类)。仅仅因为 Inner
在专门化 Outer
时没有做任何特别的事情,并不意味着它不是专门化的。考虑一下您拥有的情况,它可以编译,但随后您将成员添加到Inner
。它会突然破裂
是的,名字非常混乱。如果只是在学习 C#,我建议尝试使用一个名为例如的类层次结构。动物 -> 昆虫 -> 蝴蝶
【参考方案1】:
子类是基类类型,但不是相反。考虑将它们重命名为
class Dog
class GermanShepard : Dog
这清楚地表明,德国牧羊犬绝对是一只狗。但狗不一定是德国牧羊犬。
不可能写出以下内容,因为新狗最终可能会成为另一种狗。
GermanShepard fred = new Dog(); //error!!
可能是 Shitzu 或拉布拉多犬。但是你总是可以把德国牧羊犬扔给狗。同样,您总是可以将拉布拉多犬扔给狗。
【讨论】:
以上是关于将继承类的对象转换为继承类型的实例的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin类的继承 ② ( 使用 is 运算符进行类型检测 | 使用 as 运算符进行类型转换 | 智能类型转换 | Any 超类 )