C#で継承とかポリモーフィズムとか(1) 仮想関数?
class Super { public void Hello () { Console.WriteLine ("Hello, this is Super class."); } } class Sub : Super { public void Hello () { Console.WriteLine ("Hello, this is Sub class."); } } class MainClass { public static void Main (string[] args) { Super super = new Super(); super.Hello(); Sub sub = new Sub(); sub.Hello(); Super subInSuper = new Sub(); subInSuper.Hello(); } }
C#で継承。
よくある例。だと思う。
実行結果は,こうなりました。
Hello, this is Super class. Hello, this is Sub class. Hello, this is Super class.
3行目が,期待していたのと違う。
Superクラスのメソッドが呼び出されていて,
オーバーライドされていない?
オーバーライド"される"側にvirtual
オーバーライド"する"側にoverride
が必要らしい。
書き換えると,
class Super { public virtual void Hello () { Console.WriteLine ("Hello, this is Super class."); } } class Sub : Super { public override void Hello () { Console.WriteLine ("Hello, this is Sub class."); } } class MainClass { public static void Main (string[] args) { Super super = new Super(); super.Hello(); Sub sub = new Sub(); sub.Hello(); Super subInSuper = new Sub(); subInSuper.Hello(); } }
ちゃんと動いた。
Hello, this is Super class. Hello, this is Sub class. Hello, this is Sub class.
仮想関数。
サブクラスでオーバーライドして挙動を変更することが出来る関数。
wikipedia先生が教えてくれました。
C++やC#だとvirtualって書いて仮想関数にしないと,
オーバーライドしても挙動が変わらないらしい。
ちなみにJavaは全ての関数が仮想関数らしい。
virtual書かなくて,はまることがありそうだから気をつけないと。
以上です。
それでは,また会えることを祈りつつ。