C#_継承 と オーバーライド のMemo コード

virtual と override の使い方が分かっていなかった…。
多態性とごっちゃになっていた。
オーバーライドは親メソッドが上書きされる。
多態性はオブジェクトが複数の型に属することを許す性質。

 

親クラス

    class BaseHoge
    {
        public BaseHoge()
        {
            Console.WriteLine("B0");
        }

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

        public void BaseHoge02()
        {
            Console.WriteLine("B2");
        }
    }

 

子クラス

    class SubHoge1 : BaseHoge
    {
        public void BaseHoge01()  // コンパイルエラー ( 警告 ) が発生
        {
            Console.WriteLine("Sub01");
        }
    }

    class SubHoge2 : BaseHoge
    {
        public void BaseHoge01()
        {
            Console.WriteLine("Sub02");
        }
    }

子クラスの public void BaseHoge01 と書いたら、

「 SubHoge1.BaseHoge01() は
継承されたメンバー BaseHoge.BaseHoge01() を非表示にします。
非表示にする場合はキーワード new を使用して下さい」

コンパイルエラー ( 警告 ) が出た。
public void new BaseHoge01 と書いても書かなくても動く。何故 ?

この警告が出るのは、プログラマが意図せず
親クラスのメンバを隠蔽してしまった可能性があるため。
意図的なら問題なし。

 

呼び出し元

        private void buttonTest_Click(object sender, EventArgs e)
        {
            BaseHoge sh1 = new SubHoge1();  // 「 B0 」がコンソールに表示
            BaseHoge sh2 = new SubHoge2();  // 「 B0 」がコンソールに表示

            BaseHoge b;
            SubHoge1 s;

            b = sh1;
            s = (SubHoge1)b;
            s.BaseHoge01();  // 「 Sub01 」がコンソールに表示 ( オーバーライド ? )
            s.BaseHoge02();  // 「 B2 」がコンソールに表示 ( 継承 )

            b = sh2;
            s = (SubHoge1)b;  //例外発生
        }

というか、C# のオーバーライドの書き方は

オーバーライドされるメソッド ( 親 )
  public virtual void BaseHoge01()

オーバーライドするメソッド ( 子 )
  public override void BaseHoge01()

と、virtual ・ override キーワードを付与する必要があるのでは ?
キーワード付けたコードでも同じ結果になるけど。

このキーワードをつけると、
型が親であっても子でオーバーライドしたメソッドが呼び出される。
隠蔽ではなく、メソッドの実装を一つにできる。
上記コードの s インスタンスは親と子の BaseHoge01 二つを持っている。
BaseHoge02 につけたら異なる結果になったはず。

 

 

 

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

以上。