今日ふと電車の中で思いついた。
基本っちゃぁ基本だけど、知らなかったら知らないんじゃないだろうかと思う。
C#のインターフェイスの明示的な実装
C#のクラスってインターフェイスを実装してるからといって、必ずしもインターフェイスで定義されてるのと同じ名前のメソッドがあるわけではない。
みょうちくりんな感じもするけど、インターフェイスで定義されているメソッド名がかぶっても大丈夫♪ってするためだと思う。(他にも何かあったかな)
早速実験!まずはJavaから
interface Fooable {
void foo();
}
public class Hoge implements Fooable {
public void foo() { System.out.println("Hoge.foo()"); }
public static void main(String[] args) {
new Hoge().foo(); // 必ずfooが呼べる
}
}
なんのひねりも無いJavaのコード。これを実行するとHoge.foo()と表示される。
次はC#
using System;
interface IFoo
{
void Foo();
}
class Hoge : IFoo
{
public void Foo()
{
Console.WriteLine("Hoge.Foo()");
}
static void Main(string[] args)
{
new Hoge().Foo();
}
}
これも同じ。
Hoge.Foo()と表示される。
ただ、HogeクラスのFooの所を下のように書き換えるとコンパイルエラーになる。
using System;
interface IFoo
{
void Foo();
}
class Hoge : IFoo
{
void IFoo.Foo()
{
Console.WriteLine("Hoge.Foo()");
}
static void Main(string[] args)
{
new Hoge().Foo(); // コンパイルエラー
}
}
IFooインターフェイスのFooを明示的に実装している。
可視性は、何もつけてないのでinternalだっけ?になってるはずなのにコンパイルエラー。
HogeのインスタンスをIFooにキャストすれば問題なくFooは呼べる。
タイムリミットなのでここまで。