どれを呼ぶのか♪どれを呼ぶのか♪どれを呼ぶのか楽しみ♪(サイコロ振りながら

『interfaceの実装』に関するお話!略して!



「「「「「白矢印!白矢印!」」」」」*1






C#の経験が浅いおいらは、次のコードでどっちの関数が呼び出されるのか分からず。

// C#
interface IRozenMaiden
{
	void func();
};

class Gin : IRozenMaiden
{
	public void func()
	{
		System.Console.WriteLine("だわぁ");
	}
};

class Kana : Gin
{
	public void func()
	{
		System.Console.WriteLine("かしら");
	}
};


public class A
{
	public static int Main(String[] argv)
	{
		IRozenMaiden i;
		
		i = new Gin();
		i.func();

		i = new Kana();
		i.func();

		return 0;
	}
};
// コンパイる
>csc a.cs
Microsoft (R) Visual C# 2008 Compiler version 3.5.30729.4926
for Microsoft (R) .NET Framework version 3.5
Copyright (C) Microsoft Corporation. All rights reserved.

a.cs(21,15): warning CS0108: A.Kana.func()' は継承メンバ 'A.Gin.func()'
        を隠します。意図的に隠す場合はキーワード new を使用してください。
a.cs(13,15): (以前のエラーに関連する警告の位置)

…この警告から結果は見えたようなモンですけど(ぉ、確認の意味を含めて実行。

>a
だわぁ
だわぁ


最初の実装した関数だけ呼ばれるんですねぇ。 ふしぎふしぎー。*2

C++Javaやらざるを得ない状況になってしまった やってきたおいらとしては「最も子でオーバーライドした関数が呼ばれるんちゃうかしら?」という意識があったのですが、全然違いましたねハイ。

*1:UMLを思い出すんだ…!

*2:(C)ルビー@ジュエルペットてぃんくる