繁体   English   中英

铸造后的物体类型?

[英]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 ,而派生类CircleSquare等具有虚拟方法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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM