[英]Type of object after as cast?
鉴于该代码:
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的运行时类型是什么?
谢谢
规则很简单: 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类的类型,但该值仍保持为“派生”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.