B-Teck!

お仕事からゲームまで幅広く

【Java/C#】オーバーライドと仮想関数 -JavaとC#の違いとか-

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
//オーバーライド後

純仮想関数ってのはなんかよくわかんなかった。
Javaの抽象メソッドと同じ考えでいいのかしらん?