7

所有调用实例的运行时类型都是 D 因此,所有 F() 的调用都应该是在 D 中声明的 F() 方法。

using System;
class A
{
   public virtual void F() { Console.WriteLine("A.F"); }
}
class B: A
{
   public override void F() { Console.WriteLine("B.F"); }
}
class C: B
{
   new public virtual void F() { Console.WriteLine("C.F"); }
}
class D: C
{
   public override void F() { Console.WriteLine("D.F"); }
}
class Test
{
   static void Main() {
      D d = new D();
      A a = d;
      B b = d;
      C c = d;
      a.F();
      b.F();
      c.F();
      d.F();
   }
}

输出是:

B.F
B.F
D.F
D.F

输出不应该是:

D.F
D.F
D.F
D.F
4

3 回答 3

7

使用 Override 和 New 关键字进行版本控制(C# 编程指南)

如果派生类中的方法以 new 关键字开头,则该方法被定义为独立于基类中的方法。

因此,您的F方法来自Aand来自and的这些方法B无关,这就是为什么您会得到所得到的。CD

在运行时,CLR 寻找virtual应该从类型开始使用的方法实现,变量被声明为符合它的实际类型。For a.F()and它在声明b.F()时停止,因为是不同的方法(因为)。B.F()C.F()new

于 2013-04-08T06:21:06.820 回答
1

It should not...

A a = d;

This means you are creating a class of type A. And since you are explicitly overriding the related method in class B; A employs the method in the B class.

On the otherhand, in this line;

new public virtual void F() { Console.WriteLine("C.F"); }

You are declaring that you will not use the F() method from base by using the new keyword.

If you had overriden the F() method in D and C classes, all instance would have called the F() method declared in D class.

于 2013-04-08T06:23:39.157 回答
0

new public virtual void F()在 C:B 类中使用。这意味着F()in classCF()in classB是不同的方法。

因此,当您覆盖C类时,类D中的方法是从F()D中覆盖的C,而不是B.

另一个明显的例子可能是这样的:

  C c = new C();
  B b = c;
  b.F();
  c.F();
于 2013-04-08T06:20:12.777 回答