10
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的引用? 任何人都可以解释发生了什么事吗?

4

3 回答 3

7

在 classC中,该方法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的类型的方法。AB

于 2012-06-01T16:00:26.433 回答
3

您的 C 类 WhoAreYou() 方法是“新的”,因此对 B 隐藏了该方法。这意味着 D 类中的覆盖是覆盖 C 的方法而不是 B 的(覆盖 A)。

因为你有一个 A 的引用,所以它的 WhoAreYou() 函数的层次结构最底层是 B 类中的那个。

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

于 2012-06-01T16:00:13.100 回答
1

意思是,C的

public new virtual void WhoAreYou(){}

打破虚方法链。

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

于 2012-06-01T18:24:22.810 回答