C#_オーバーライド virtual と override

基底クラスのメンバが隠蔽されている場合、
どのメンバが呼び出されるかは変数の型 ( 静的な型 ) によって決定する。

だが、
ほとんどの場合メソッドの呼び出しは動的に決定した方が都合がいい。
動的な型 に基づいて呼び出されるメソッドを選びたい場合の記述方法。

インスタンスの型:動的な型

 

オーバーライド

メソッドに対しては、基底クラスのメソッドを隠蔽するのではなく、
同一のシグネチャのメソッドの実装を常に 1 つに決定することが出来る。

つまり、
変数の型ではなくインスタンスの型によって呼び出すメソッドを決定する。
このような仕組みをオーバーライドという。

 

多態性

オーバーライドされたメソッドは、
変数が参照するインスタンス応じて呼び出される。

これは、コードを変更することなく
参照するインスタンスによって実行するメソッド
切り替えられることを意味しており、抽象的な設計に欠かせない機能。

 

オーバライドによって実現される、
同一のコードが状態に応じて多様な振る舞いをとる性質のことを
多態性 ( ポリモーフィズム ) と呼ぶ。  

 

virtual 修飾子 と override 修飾子

派生クラスでメソッドをオーバライドするには
対象のメソッドが仮想メソッド必要がある。

仮想メソッドは
virtual 修飾子によって宣言されたメソッドで、
派生クラスによってメソッドの実装を取り換えることを許容する。
( 動的な型に基づいて呼び出されるメソッドを選択できる。 )

これに対して通常のメソッドのことを非仮想メソッドとも呼ぶ。

 

仮想メソッドを派生クラスでオーバライドするには、
メソッド宣言で override 修飾子を指定する。
プログラマの意図しないところでメソッドが
オーバライドされてしまうのを防ぐため、オーバーライドする際には
override明示的につける。

override で宣言されたメソッドのことをオーバライドメソッドと呼ぶ。

ex )

親クラス

    class BaseHoge
    {
        public virtual void BaseHoge01()
        {
            Console.WriteLine("B1");
        }
    }

 

子クラス

    class SubHoge : BaseHoge
    {
        public override void BaseHoge01()
        {
            Console.WriteLine("Sub01");
        }
    }

SubHogeインスタンスへの参照から BaseHoge01 メソッドを
呼び出した場合、
参照の型が何であっても ( 例えば BaseHoge 型の変数からでも )
SubHoge クラスの BaseHoge01 メソッドが呼び出される。

 

--Memo--
    変数A = new クラスB;
インスタンスを変数Aへ格納。変数Aは参照型。

変数Aの型を静的な型といい、
格納されているインスタンスの型動的な型という。

 

 

 

こちらから。
http://www.wisdomsoft.jp/360.html
https://ufcpp.net/study/csharp/oo_polymorphism.html#virtual

以上。