动态绑定(隐藏)如何工作?
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
,因为它令人困惑。
我一直在练习动态绑定(隐藏),我遇到了如下代码块。
程序的输出是:
"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
,因为它令人困惑。