3

質問があります。このコードで、One()メソッドがクラスBから実行され、Two()メソッドがクラスAから実行されるのはなぜですか?それがキャスティングをしていることは知っていますが、その方法が機能しているのかわかりません。ちなみに、この種のトリックを使った良いリンクや本は大歓迎です。あなたより。

class Program
{
    static void Main(string[] args)
    {
        B b = new B();
        A a = (A)b;

        a.One(); 
        a.Two(); 
    }
}

public class A
{
    public virtual void One()
    {
        Console.WriteLine("A One");
    }
    public void Two()
    {
        Console.WriteLine("A Two");
    }
}

public class B : A
{
    public override void One()
    {
        Console.WriteLine("B One");
    }
    public new void Two()
    {
        Console.WriteLine("B Two");
    }
}
4

2 に答える 2

5

これは、Two()が仮想メソッドではないためです。Two()クラスから呼び出されるのBは、のインスタンスを具体的に調べている場合のみですB。クラスAには、呼び出すときに仮想メソッドのルックアップテーブルがないためTwo()、他の場所で別のメソッドを探す必要はありません。

この質問に対する私の回答で詳細を確認できます。

于 2012-12-01T03:32:54.070 に答える
0

Two()メソッドはクラスAでは仮想ではありません(したがって、B.Two()をnewとして作成する必要があったのとほぼ同じ理由で、オーバーライドできません。そうでない場合、コンパイラは文句を言います)。

したがって、基本クラスに仮想メソッドがない場合、それはオーバーライドされることを意図していません。したがって、タイプBのオブジェクトをタイプAにキャストすると、Two()メソッドの呼び出しは、タイプBではなくタイプAのメソッドテーブルにバインドされます。

あなたはここでそれについてもっと読むことができます:

http://msdn.microsoft.com/en-us/library/6fawty39(v=vs.80).aspx http://www.akadia.com/services/dotnet_polymorphism.html

于 2012-12-01T03:35:20.737 に答える