C# 中的动态绑定

本文关键字:动态绑定 | 更新日期: 2023-09-27 18:36:06

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"); }
}

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

如何在内部分配,引用 A 包含 B 的引用?谁能解释一下发生了什么?

C# 中的动态绑定

在类 C 中,方法WhoAreYou()不会覆盖基类方法,因为它是用 new 关键字定义的,该关键字添加了一个的新方法,隐藏了基类方法。这就是为什么:

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

调用 D 中重写的方法,该方法重写使用 new 关键字定义的基类方法。

但是,当目标类型为 A 时,则:

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

B 中调用被覆盖的方法,因为您正在a类型的 A 上调用该方法,该方法被 B 覆盖。

你的类C方法WhoAreYou()方法是"新的",因此对B隐藏了那个。这意味着类 D 中的覆盖正在覆盖 C 的方法而不是 B 的方法(它正在覆盖 A)。

由于您有对 A 的引用,因此其层次结构中最靠后的 WhoAreYou() 函数是 B 类中的函数。

http://msdn.microsoft.com/en-us/library/435f1dw2.aspx

意思是,C 的

public new virtual void WhoAreYou(){}

打破虚拟方法链。

当你通过引用 A 调用 D 的 WhoAreYou() 方法时。虚拟开始工作,但它在 C 处中断。