C#中的动态绑定

时间:2012-06-01 15:46:44

标签: c# dynamic-binding

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的引用? 任何人都可以解释一下是怎么回事?

3 个答案:

答案 0 :(得分:7)

在类C中,方法WhoAreYou()不会覆盖基类方法,因为它是使用new关键字定义的,它添加了 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覆盖。

答案 1 :(得分:3)

你的C类WhoAreYou()方法是'new',因此隐藏了B中的那个。这意味着D类中的覆盖覆盖C的方法而不是B的(覆盖A的)。

由于你有一个A的引用,它的层次结构中最远的是WhoAreYou()函数是B类中的一个。

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

答案 2 :(得分:1)

这意味着,C的

public new virtual void WhoAreYou(){}

打破了虚拟方法链。

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