作为强制转换后的对象类型
本文关键字:对象 类型 转换 | 更新日期: 2023-09-27 18:15:45
给定该代码:
class B
{
public virtual string Method()
{
return "base";
}
}
class D : B
{
public override string Method()
{
return "derived";
}
}
D d = new D();
B b = d as B;
b.Method();
"派生"是输出。
但究竟是为什么呢?我的意思是,b 是 B 类型的新对象,不是吗?还是它与 d 是同一个对象(在内存中(?如果是这样,那么 b 的运行时类型是什么,B 还是 D?
谢谢
规则很简单:b
是对类型为 D
的对象的引用。您可以说运行时类型的b
是D
但这并不是特别有用的术语。
你可以做
B b = new D();
b.Method();
你仍然会被"派生"。如@Bathsheba所述,重要的是对象类型而不是引用。
想象一下典型的 OOP 示例,其中您有一个基类Shape
,其中包含派生类 Circle
、Square
等,如果您具有这样的方法,则Area
void ShowArea(Shape shape)
{
Console.WriteLine(shape.Area());
}
引用无关紧要(而是实际的对象类型(这一事实使上述方法能够接受任何类型的Shape
并且仍然打印正确的区域
b 是 B 类型的新对象,不是吗?
不,b
是 B
类型的现有对象,它指向您在其上方创建的同一对象:d
。 唯一的区别是您已将对象强制转换为其父类型 -- B
,因此b
被视为B
而不是派生更多的类型 D
。
获得输出"派生"的原因是该方法在派生类中被重写,这就是重写的工作方式。 仅仅因为你声明了一个变量(即 b
(作为其派生较少的类型B
并不意味着它实际上仍然不是派生较多的类型D
。 这就是多态性的本质。
B b = d as B;
我相信这行代码只将 d 转换为类 B 的类型,但值仍然保持为"派生"。