将继承类的对象转换为继承类型的实例

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。内容无关紧要。 如果您将事物命名为 BaseSub,顺便说一句,这会容易得多。 Outer 类型的变量可以引用 Outer 的实例或 Outer 的任何子类的实例(在本例中为 Inner)。但是,InnerOuter特化,因此Inner 的变量只能引用Inner 对象(或Inner 的任何子类)。仅仅因为 Inner 在专门化 Outer 时没有做任何特别的事情,并不意味着它不是专门化的。考虑一下您拥有的情况,它可以编译,但随后您将成员添加到Inner。它会突然破裂 是的,名字非常混乱。如果只是在学习 C#,我建议尝试使用一个名为例如的类层次结构。动物 -> 昆虫 -> 蝴蝶 【参考方案1】:

子类是基类类型,但不是相反。考虑将它们重命名为

class Dog 
class GermanShepard : Dog 

这清楚地表明,德国牧羊犬绝对是一只狗。但狗不一定是德国牧羊犬。

不可能写出以下内容,因为新狗最终可能会成为另一种狗。

GermanShepard fred = new Dog();  //error!!

可能是 Shitzu 或拉布拉多犬。但是你总是可以把德国牧羊犬扔给狗。同样,您总是可以将拉布拉多犬扔给狗。

【讨论】:

以上是关于将继承类的对象转换为继承类型的实例的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin类的继承 ② ( 使用 is 运算符进行类型检测 | 使用 as 运算符进行类型转换 | 智能类型转换 | Any 超类 )

Part7 继承与派生 7.3基类与派生类类型转换

Java多态对象的类型转换和动态绑定

继承与多态,动手动脑

PHP:如何将对象转换为继承的类?

<继承问题>可以把基类对象赋值给子类对象么?