Javaを触った後C#を触って、メソッドのオーバーライドと仮想関数の話で???ってなったんでメモ代わりに。
Java
Javaで普通に継承してオーバーライドをするとこう。
fooクラスのインスタンスのtwoは当然fooクラスで定義されたtwoメソッドが呼ばれる。
public class Main { public static void main(String[] args) throws Exception { foo A = new foo(); A.one(); } } class hoge { public void one(){ System.out.println("hoge"); two(); } public void two(){ System.out.println("オーバーライド前"); } } class foo extends hoge { public void two(){ System.out.println("オーバーライド後"); } } //出力結果 //hoge //オーバーライド後
C#
じゃあということでC#で同じように書くと…あれ?
public class Test{ public static void Main(){ foo A = new foo(); A.one(); } } public class hoge { public void one(){ System.Console.WriteLine("hoge"); two(); } public void two(){ System.Console.WriteLine("オーバーライド前"); } } public class foo : hoge { public void two(){ System.Console.WriteLine("オーバーライド後"); } } //出力結果 //hoge //オーバーライド前
ちなみに、paiza.ioで動作確認した時はオーバーライド失敗でエラー(Warning)吐きながら動いてた。
C#(仮想関数)
アイエエエ!?ナンデ!?オーバーライド前ナンデ!?アバーッ!!
と思ったら、C#では仮想関数(仮想メソッド)っていう形にして、
「オーバーライドできるぞ!」って明示的に教えてやらなきゃいけないらしい。
Info Archive - C# - 仮想関数 と 純仮想関数
public class Test{ public static void Main(){ foo A = new foo(); A.one(); } } public class hoge { public void one(){ System.Console.WriteLine("hoge"); two(); } public virtual void two(){//virtualって書いてあるからオーバーライドできるよ! System.Console.WriteLine("オーバーライド前"); } } public class foo : hoge { public override void two(){//overrideって書いてあるからオーバーライドできるよ! System.Console.WriteLine("オーバーライド後"); } } //出力結果 //hoge //オーバーライド後