同じインターフェースの実装 §
一つのオブジェクトに同じインターフェースを複数実装することができます。
下のサンプルソースでは、インターフェースX1を実装したクラスAを継承して、インターフェースX1を実装したクラスBを作成しています。
つまり、クラスBのインスタンスはインターフェースX1を2回実装しています。
では、インターフェースX1に含まれるメソッドSubは2つなのかというとそこは微妙で、一つという使い方もあるし、2つあるという使い方もあります。
もし、別々のメソッドにしたいときには【インターフェースのメンバーを明示的に実装する】という書式を使います。サンプルソースではvoid X1.Sub()で始まるメソッドがそれにあたります。ここではインターフェースX1の名前を明示して実装しています。このX1はそのクラスで指定されたインターフェースX1を意味します。
これで、2つのメソッドSubは使い分けることができます。そのまま呼ぶと1つめのSubメソッド、型X1を経由して呼ぶと2つめのSubメソッドになります。
罠の数々 §
- 同じ名前のメソッドが異なる機能を持つとトラブルになるので避けたいが、複雑な継承階層があると発生しがちなのも確か。型によって呼び出し先が異なることに注意しよう
- インターフェースには暗黙の実装と明示的な実装がある。使い方、制限事項に差異があるので注意しよう
- クラスで同じことは起きない。C#は多重継承を許していないので、常に継承できるクラスは1つに限られているからだ。でも、インターフェースにそのような制約はない。
参考リンク §
interface (C# リファレンス)
明示的なインターフェイスの実装 (C# プログラミング ガイド)
リポジトリ §
https://github.com/autumn009/cshowto
SameNameMethod2 §
using System;
interface X1
{
void Sub();
}
class A : X1
{
public void Sub()
{
Console.WriteLine("I'm X1.Sub in A");
}
}
class B : A, X1
{
void X1.Sub()
{
Console.WriteLine("I'm X1.Sub in B");
}
}
class Program
{
static void Main()
{
var b = new B();
b.Sub();
((X1)b).Sub();
}
}
実行結果
I'm X1.Sub in A
I'm X1.Sub in B