-1

以下のコードの結果が である理由を教えてくださいBaseClass::method。DerivedClass2 は、新しいものとして宣言されている DerivedClass1 の仮想メソッドをオーバーライドするだけだと考えていました。つまり、BaseClass メソッドは使用されません。または、DerivedClass2 は DerivedClass1 の仮想メソッドをオーバーライドするため、DerivedClass1 または BaseClass のメソッドではなく、DerivedClass2 メソッド バージョンを呼び出す動的バインディングがあります。何か助けはありますか?私の推論の何が問題になっていますか?ありがとう

class BaseClass
    {
        public void method() { Console.WriteLine("BaseClass::method"); }
    }
    class DerivedClass1 : BaseClass
    {
        public new virtual void method() { Console.WriteLine("DerivedClass1::method"); }
    }
    class DerivedClass2 : DerivedClass1
    {
        public override void method(){ Console.WriteLine("DerivedClass2::method"); }
    }
    class Program
    {
        static void Main(string[] args)
        {    
            BaseClass e = new DerivedClass2();
            e.method();//BaseClass::method. But Why???

            Console.ReadLine();
        }
    }
4

3 に答える 3

0

BaseClass.method()仮想ではありません。の仮想メソッドによって非表示DerivedClass1になり、 でオーバーライドされDerivedClass2ます。

変数の型はeBaseClassあり、それはコンパイラが呼び出すメソッドを見つけるために使用するものです。唯一のオプションは非仮想BaseClass.method()です。変数の型を に変更するDerivedClass1と、コンパイラは呼び出しをvirtual new DerivedClass1.method(). 実行時にDerivedClass2.method()が呼び出されます。

new修飾子でメソッドを非表示にすると、ポリモーフィックな動作を期待しないでください。

于 2015-10-25T16:54:51.520 に答える
0

virtualの非メソッドを呼び出していますBaseClass

派生クラスが他のメソッドを追加するかどうかに関係なく、それが呼び出されるメソッドです。

于 2015-10-25T16:40:56.753 に答える
0

この行では:

BaseClass e = new DerivedClass2(); 

eオブジェクトのように動作しBaseClassます。したがって、 を呼び出しますBaseClass.method

あなたが書いたようなものです:

DerivedClass2 e = new DerivedClass2();
((BaseClass)e).method();

継承とポリモーフィズムについてもっと読んで理解する必要があります。

于 2016-01-14T12:52:27.437 に答える