动态绑定(隐藏)如何工作?

How Dynamic Binding (with hiding) works?

我一直在练习动态绑定(隐藏),我遇到了如下代码块。

程序的输出是:

"I am a B"

我就是听不懂。

谁能给我解释一下?提前致谢。

class A
{
    public virtual void WhoAreYou() { Console.WriteLine("I am an A"); }
}
class B : A
{
    public override void WhoAreYou() { Console.WriteLine("I am a B"); }
}
class C : B
{
    public new virtual void WhoAreYou() { Console.WriteLine("I am a C"); }
}
class D : C
{
    public override void WhoAreYou() { Console.WriteLine("I am a D"); }
}

   
A a = new D();
a.WhoAreYou(); // "I am a B" !!

这里的“技巧”就在这一行:public **new** virtual void WhoAreYou()。这会在 class C 中创建一个新的虚拟成员,而不是覆盖基本实现。因此,具有静态类型 A 的虚拟调用 a.WhoAreYou() 解析为 B,因为 B 中的 public override void WhoAreYou() 覆盖了 A 的实现,但不会进一步覆盖。

如果你去哪里办

C c = new D();
c.WhoAreYou(); // "I am a D" !!

这将解析为 D。在这种情况下,C/D 和 A/B 的方法 WhoAreYou 完全不同,如果它们完全不同,效果将相同名字。

这是一个非常罕见的场景,我实际上没有看到任何常用的API使用概念来声明方法new virtual,因为它令人困惑。