C# 基类和子类之间的强制转换
我有一个关于基类和它的子类之间的转换的问题: (1) 为什么允许这样做C# 基类和子类之间的强制转换,c#,casting,C#,Casting,我有一个关于基类和它的子类之间的转换的问题: (1) 为什么允许这样做 BaseClass b = new ChildClassA(); ChildClassA c = (ChildClassA)b BaseClass b = new BaseClass(); ChildClassA c = (ChildClassA)c; ChildClassA c = new ChildClassA(); BaseClass b = (BaseClass)c; (2) 为什么这是不允许的 ChildCl
BaseClass b = new ChildClassA();
ChildClassA c = (ChildClassA)b
BaseClass b = new BaseClass();
ChildClassA c = (ChildClassA)c;
ChildClassA c = new ChildClassA();
BaseClass b = (BaseClass)c;
(2) 为什么这是不允许的
ChildClassA c = (ChildClassA)new BaseClass();
BaseClass b = (BaseClass)c;
(3) 为什么允许这样做
BaseClass b = new ChildClassA();
ChildClassA c = (ChildClassA)b
BaseClass b = new BaseClass();
ChildClassA c = (ChildClassA)c;
ChildClassA c = new ChildClassA();
BaseClass b = (BaseClass)c;
(4) 为什么允许这样做
BaseClass b = new ChildClassA();
ChildClassA c = (ChildClassA)b
BaseClass b = new BaseClass();
ChildClassA c = (ChildClassA)c;
ChildClassA c = new ChildClassA();
BaseClass b = (BaseClass)c;
嗯
(2) 是不允许的,因为您不能将基类
强制转换为ChildClassA
-通过继承ChildClassA
的实例也是基类
,但不是相反
孩子知道自己的父母有什么,但父母不知道孩子有什么。一般来说,这是因为ChildClassA可能定义了基类不知道的东西,而ChildClassA源于基类,所以它知道关于它的一切。从“是a”的角度思考。我们可以说
ChildClassA
“的任何实例都是一个“BaseClass
,其中classchildclassa:BaseClass
。但反之亦然。在这种情况下,我们不能说BaseClass
“的任何实例都是“ChildClassA
”
现在试着按照如下方式阅读代码行。我相信这次会更有意义
new ChildClassA()
是ChildClassA
的一个实例,那么它也“是”基类。因此,我们可以将new ChildClassA()
分配给b
,该类型为BaseClass
我们可以将b
转换为ChildClassA
,因为它实际上(指向)了ChildClassA
的一个实例
我们不能将new BaseClass()
转换为ChildClassA
,因为BaseClass
“的实例不是”ChildClassA
转换被允许或不被允许的原因是继承背后的基础
子类(或派生类)始终是基类,但事实并非如此
为了解释,让我们为示例类使用一些更真实的名称:
class Animal
{
}
class Dog : Animal
{
}
class Cat : Animal
{
}
因此,对于您的示例(1):
这是真的,因为所有的狗都是动物,而你的动物b实际上是狗,所以演员阵容是成功的
对于您的示例(2):
这是不可能的,因为您正在将动物对象指定给狗,但您知道并非所有动物都是狗,有些动物是猫
例如(三)及(四):
这与上面的示例1相同。所有的狗都是动物,所以任何狗都可以被归类为动物和演员(事实上,你不需要演员,会有一个隐式演员,你可以把它写成动物b=c;
注意(2)是编译器允许的-但是在运行时你会得到一个InvalidCastException
。我不知道为什么我要编辑我的答案,我也想用狗的例子。我想在教学世界里,动物就像蜜蜂一样呆在编程中,呆在性爱中