【ターン】仮想仮想メソッドのC#の詳細

ターン:https://www.cnblogs.com/zhaoshujie/p/10502404.html

C ++、Java、および他の多くのOOP言語では、完全なオブジェクト指向言語としての仮想図、およびC#のを見ることができる例外ではありません。

仮想関数をC#プログラミングの観点からコンパイルされ、それと他の一般的な機能は何の違いを作るのですか?静的実行可能ファイルにコンパイルされ、コンパイル時に一般的な機能は、相対アドレスが死んで書かれたプログラムの実行、中に変更されていません!コンパイル時に仮想関数が静的にコンパイルされていない、その相対アドレスは、それが動的に述べた時間を、実行されているオブジェクトインスタンスに応じて呼び出される関数を決定する、定かではそのクラスがAFFIRMと呼ばれるクラスの定義、その実装あなたはクラスのインスタンスと呼ばれるクラスをインスタンス化するとき。

以下のような:すずめ鳥鳥=新しい();
これは、クラスの鳥、クラスのインスタンスをスズメ記載されています。

具体的な検査方法は以下の通りです

関数は、すなわち、クラス宣言、仮想関数かどうかを確認するために呼び出された関数、オブジェクトクラス宣言の定義を確認するために、直接システム、オブジェクトと呼ばれる1、。

ない仮想関数場合2、それが直接の機能を実行します。そして、それはすぐに機能を実行しませんが、クラスの検査オブジェクトインスタンスに回すために、この時間ので、仮想関数である仮想キーワードは、存在する場合。

3、クラスのこのインスタンスでは、彼が再実装した場合(overrideキーワードを介して)仮想関数を見てチェックし、存在する場合、[OK]を、それはクラスのこのインスタンスの定義を見つけることができません、との直後に実施この関数のインスタンスクラスを再実装。そうでない場合、システムは、クラスの親クラスのインスタンスを探し続けるだろう、とあなたは親クラスの仮想関数の最初のオーバーロードされた日付を見つけるまで、親クラスはその後、クラスのインスタンスで検査を繰り返します過負荷後の親クラスの機能の実装。

これを知って、私たちは、次のコードの業績を理解することができます。

使用してシステムを。

名前空間VirtualMethodTest
{
    クラスA
    {
        パブリック 仮想 のFunc()//が、これは仮想関数であることを、仮想的に注意してください
        {
            Console.WriteLineを(" のFuncにおいてA " )。
        }
    }

    クラス B:A // クラスAから注Bの継承は、それが親クラスAであり、Bは、のサブクラスである
    {
         公共 オーバーライド ボイドのFunc()// 示しオーバーライド、仮想関数を再実装することを注意
        {
            Console.WriteLineを(" のFuncにおいてB " )。
        }
    }

    クラス C:B // クラスBから注Cの継承、それはBの親であり、Cはのサブクラスです
    {
    }

    クラス D:A // Aは、親クラスであるので、クラスAから注Dの継承は、Dのサブクラスである
    {
         パブリック 新しい新しい ボイドのFunc()// 新しいメモ、親クラスをオーバーライドし、同じ名前のクラスのことを示すのではなく、再実装します
        {
            Console.WriteLineを(" のFuncでD " )。
        }
    }

    クラスプログラム
    {
        静的な 無効メイン()
        {
            A;          //は。Aこれは、クラスの宣言であり、このクラスAのオブジェクトを定義 
            AとB;          // B BこのクラスA Aのオブジェクトを定義し、Aクラスの宣言である。 
            A、C;          //はCを定義しますこのクラスのこのクラスAのオブジェクトcが肯定さ 
            D;          //は、DクラスDの宣言されたオブジェクトクラスを定義する
 = 新しい新しい A(); // インスタンス化主題でありますクラスの例 
            B = 新しい新 ; B()// B bはクラスのインスタンスであるインスタンス化オブジェクトBは、 
            C = 新しい新しい C(); // インスタンス化オブジェクトC、C cはクラスのインスタンスである 
            D = 新しい新)D( ; // インスタンス化オブジェクトD、D、Dは、クラスのインスタンスである
            a.Func();    
// a.Funcを実行:. 1つのAFFIRMチェックをクラスA転送の方法は、クラスAの仮想インスタンスをチェックすることである。3.を確認するために、それ自体がでA 5でのFuncの出力クラスのインスタンスを実行する4. A法である 
            Bを; .FUNCは()     // b.Func行う:1に記載の方法は、クラスBをチェックするために、仮想スイッチインスタンスをチェック述べクラス2をチェックするために、方法は、前記実施例5 Bクラスのオーバーロードが行われています。 Func中のB出力 
            c.Func();     // c.Funcを実行:. 1つのAFFIRMチェッククラスを確認するために2次転写する方法を確認するスイッチ4をオーバーロードすることなく、クラスCの仮想インスタンスをチェックすることである3。親クラスC Bは、funcがメソッドは、親5 B 5 BのFuncでの出力実行が過負荷 
            d.Funcを();     // d.Func行う:述べたタイプ2をチェックする1 .. 3.チェック仮想メソッドがありませんオーバーロードされたクラスDのインスタンスをチェックするために有効にすることです(この場所はDのFunc(が達成されているが、ことに留意すべきである)、過負荷状態にしているとみなされることはありませんので、overrideキーワードを使用しませんでした)前記クラスDスイッチは、それ自体が5でのFunc 5の親クラスのメソッドを実行すると、親クラスAを確認するのFuncの出力 
            D = D1 新しい新D();
            d1.Func(); // 実行クラスDレーンのFunc()において、D出力のFunc 
            Console.ReadLine();
        }
    }
}

 

おすすめ

転載: www.cnblogs.com/sggggr/p/11846956.html