投射后的对象类型?

时间:2016-11-01 16:11:53

标签: c# casting

鉴于代码:

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?

由于

4 个答案:

答案 0 :(得分:3)

规则很简单:b是对D类型对象的引用。您可以说b的运行时类型为D,但这并不是特别有用的术语。

答案 1 :(得分:2)

你可以做到

B b = new D();
b.Method();

你仍然得到"派生"。正如@Bathsheba所提到的,重要的是对象类型而不是引用。

想象一下典型的OOP示例,其中您有一个基类Shape,其派生类CircleSquare等,虚拟方法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'。