いろいろガンガンいこうぜ。体も大事に

普段はJavaでAndroidアプリ開発しているプログラマーのブログです。

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書かなくて,はまることがありそうだから気をつけないと。




以上です。
それでは,また会えることを祈りつつ。