インターフェースとは、クラスで実装すべきメソッド、プロパティ、インデクサ、イベントなどを示し、それ自身では一切実装しない抽象的な存在です。
インターフェースの宣言は次のように行います。
interface インターフェース名
{
戻り値の型 メソッド名(パラメータリスト);
データ型 プロパティの名前{get;set;}
データ型 this[データ型 インデックス]{get;set;}
...
}
インターフェースの名前は好きにつけてよいのですが、慣習で大文字のIから始まる名前にすることが多いようです。インターフェースのメンバは全部自動的にpublicとなります。(アクセス修飾子を自分でつけることはできない)
また、staticなメンバも定義することはできません。
インターフェースは、フィールドを持つことはできません。コンストラクタやデストラクタも持つことはできません。
interface自体にpublic修飾子をつけると、このインターフェースは無条件であらゆるクラスに実装できることになります。
クラスにインターフェースを実装するには、次のようにします。
class クラス名:インターフェース名
{
...(実装)
}
この場合、インターフェース中のすべてのメンバを実装しなくてはいけません。複数のインターフェースを実装することも可能です。この場合カンマ(,)で区切ります。
class クラス名:インターフェース1, インターフェース2,...どうして、インターフェースのようなものが必要なのでしょうか。これは、あらかじめ クラスがどのように振る舞うべきかを定めておくことにより、プログラミングの方向性を指し示す指針となるのです。
難しいことはさておき、インターフェースを作って、実際にこれを実装してみましょう。
// interface01.cs
using System;
public interface IMyInterface
{
double Pulus(double a, double b);
}
class MyClass : IMyInterface
{
public double Pulus(double x, double y)
{
return x + y;
}
}
class interface01
{
public static void Main()
{
MyClass mc = new MyClass();
string strFormat = "{0} + {1} = {2}";
Console.WriteLine(strFormat, 100, 200, mc.Pulus(100, 200));
Console.WriteLine(strFormat, 10.5, 12.5, mc.Pulus(10.5, 12.5));
}
}
インターフェースIMyInterfaceのメンバは、double型の引数を2つ持ち戻り値がdouble型の
メソッドPlusを持ちます。これを見るだけで、IMyInterefaceを実装するクラスは、double型の演算をするクラスなのだなー、と想像できます。
MyClassクラスではIMyInterefaceインターフェースを実装します。
Mainメソッドでは、MyClassのインスタンスを生成して足し算の計算をさせていますね。
実行結果は次のようになります。
Update 01/Oct/2006 By Y.Kumei