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

1

それはすべきではありません...

A a = d;

これは、 type のクラスを作成していることを意味しますA。また、クラスで関連するメソッドを明示的にオーバーライドしているため、B; AメソッドをBクラスで使用します。

一方、この行では;

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

キーワードF()を使用して、ベースからメソッドを使用しないことを宣言しています。new

F()クラスでメソッドをDオーバーライドした場合C、すべてのインスタンスはクラスでF()宣言されたメソッドを呼び出しますD

于 2013-04-08T06:23:39.157 に答える