作为强制转换后的对象类型

本文关键字:对象 类型 转换 | 更新日期: 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 的对象的引用。您可以说运行时类型的bD但这并不是特别有用的术语。

你可以做

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

你仍然会被"派生"。如@Bathsheba所述,重要的是对象类型而不是引用。

想象一下典型的 OOP 示例,其中您有一个基类Shape,其中包含派生类 CircleSquare 等,如果您具有这样的方法,则Area

void ShowArea(Shape shape)
{
    Console.WriteLine(shape.Area());
}

引用无关紧要(而是实际的对象类型(这一事实使上述方法能够接受任何类型的Shape并且仍然打印正确的区域

b 是 B 类型的新对象,不是吗?

不,bB 类型的现有对象,它指向您在其上方创建的同一对象:d 。 唯一的区别是您已将对象强制转换为其父类型 -- B ,因此b被视为B而不是派生更多的类型 D

获得输出"派生"的原因是该方法在派生类中被重写,这就是重写的工作方式。 仅仅因为你声明了一个变量(即 b (作为其派生较少的类型B并不意味着它实际上仍然不是派生较多的类型D。 这就是多态性的本质。

B b = d as B;

我相信这行代码只将 d 转换为类 B 的类型,但值仍然保持为"派生"。