鉴于代码:
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?
由于
答案 0 :(得分:3)
规则很简单:b
是对D
类型对象的引用。您可以说b
的运行时类型为D
,但这并不是特别有用的术语。
答案 1 :(得分:2)
你可以做到
B b = new D();
b.Method();
你仍然得到"派生"。正如@Bathsheba所提到的,重要的是对象类型而不是引用。
想象一下典型的OOP示例,其中您有一个基类Shape
,其派生类Circle
,Square
等,虚拟方法Area
..如果您有像这样的方法:
void ShowArea(Shape shape)
{
Console.WriteLine(shape.Area());
}
引用无关紧要(而不是实际的对象类型)这一事实使上述方法能够接受任何类型的Shape
并仍然打印正确的区域
答案 2 :(得分:1)
b是B类型的新对象,不是吗?
不,b
是类型为B
的现有对象,它指向您在其上方创建的同一对象:d
。唯一的区别是您将对象转换为其父类型 - B
,因此b
被视为B
而不是更多派生类型D
。
你获得输出"派生的原因"是因为在派生类中重写了该方法,并且覆盖是如何工作的。仅仅因为你声明一个变量(即b
)作为其较少派生的类型B
并不意味着它实际上仍然不是更多派生的类型D
。这就是多态性的本质。
答案 3 :(得分:0)
B b = d as B;
我相信这行代码只会将d转换为类B的类型,但该值仍然保留为'derived'。