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
中,方法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 处中断。