どれを呼ぶのか♪どれを呼ぶのか♪どれを呼ぶのか楽しみ♪(サイコロ振りながら
『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 と やらざるを得ない状況になってしまった やってきたおいらとしては「最も子でオーバーライドした関数が呼ばれるんちゃうかしら?」という意識があったのですが、全然違いましたねハイ。