インターフェイス (C# プログラミング ガイド)
更新 : 2007 年 11 月
インターフェイスは、次の例に示すように、interface キーワードを使用して定義します。
interface IEquatable<T>
{
bool Equals(T obj);
}
インターフェイスは、任意のクラスまたは構造体に属する関連機能のグループを表します。インターフェイスは、メソッド、プロパティ、イベント、インデクサ、またはこれら 4 つのメンバの型を自由に組み合わせて構成できます。インターフェイスには、フィールドを含めることができません。インターフェイス メンバは自動的にパブリックになります。
あるクラスまたは構造体がインターフェイスを継承するとは、そのクラスまたは構造体が、インターフェイスに定義されているすべてのメンバを実装することを意味します。基本クラスの機能が継承可能であるのとは異なり、インターフェイス自体には、クラスや構造体によって継承できる機能はありません。ただし、基本クラスがインターフェイスを実装している場合は、その実装が派生クラスに継承されます。
クラスが基本クラスや構造体を継承できるのと同じように、クラスも構造体もインターフェイスを継承できますが、この場合、次の 2 点が異なります。
クラスや構造体は、複数のインターフェイスを継承できます。
クラスや構造体は、インターフェイスを継承するとき、メソッド名とシグネチャだけを継承します。これは、インターフェイス自体には実装が含まれていないからです。次に例を示します。
public class Car : IEquatable<Car> { public string Make {get; set;} public string Model { get; set; } public string Year { get; set; } // Implementation of IEquatable<T> interface public bool Equals(Car car) { if (this.Make == car.Make && this.Model == car.Model && this.Year == car.Year) { return true; } else return false; } }
インターフェイス メンバを実装するには、クラスの対応するメンバは、パブリックかつ非静的であり、その名前とシグネチャがインターフェイス メンバと一致する必要があります。クラスのプロパティとインデクサでは、インターフェイスで定義されているプロパティやインデクサに追加のアクセサを定義できます。たとえば、インターフェイスでは、get アクセサを持つプロパティを宣言できますが、このインターフェイスを実装するクラスでは、get と set の両方のアクセサを持つ同じプロパティを宣言できます。ただし、プロパティやインデクサで明示的な実装を使用する場合は、アクセサを一致させる必要があります。
インターフェイスとインターフェイス メンバは抽象であり、インターフェイスは既定の実装を提供しません。詳細については、「抽象クラスとシール クラス、およびクラス メンバ (C# プログラミング ガイド)」を参照してください。
IEquatable<T> インターフェイスが実装されている場合、オブジェクトのユーザーには、そのオブジェクトが同じ型の他のオブジェクトと等しいかどうかを、オブジェクト自身が判断できるということがわかります。インターフェイスのユーザーは、これがどのように実装されているかを理解する必要はありません。
インターフェイスは、他のインターフェイスを継承できます。クラスでは、継承した基本クラスやインターフェイスを介して、インターフェイスを繰り返し継承できます。このときクラスは、インターフェイスが新しいクラスの一部として宣言されている場合、インターフェイスを 1 回のみ実装できます。継承されたインターフェイスが新しいクラスの一部として宣言されていない場合、インターフェイスの実装は、それを宣言した基本クラスによって提供されます。基本クラスでは、仮想メンバを使ってインターフェイス メンバを実装できます。その場合、インターフェイスを継承するクラスでは、仮想メンバをオーバーライドしてインターフェイスの動作を変更できます。仮想メンバの詳細については、「ポリモーフィズム」を参照してください。
インターフェイスの概要
インターフェイスには、次の特徴があります。
インターフェイスは抽象基本クラスに似ています。インターフェイスを継承する非抽象型は、すべてのインターフェイス メンバを実装する必要があります。
インターフェイスは直接インスタンス化できません。
インターフェイスには、イベント、インデクサ、メソッド、およびプロパティを含めることができます。
インターフェイスには、メソッドの実装が含まれません。
クラスと構造体は、複数のインターフェイスを継承できます。
インターフェイス自体が複数のインターフェイスを継承できます。
このセクションの内容
明示的なインターフェイスの実装 (C# プログラミング ガイド)
インターフェイスに固有のクラス メンバを作成する方法について説明します。方法 : インターフェイス メンバを明示的に実装する (C# プログラミング ガイド)
インターフェイスのメンバを明示的に実装する方法の例を示します。方法 : 継承を使用してインターフェイス メンバを明示的に実装する (C# プログラミング ガイド)
継承を使用してインターフェイスのメンバを明示的に実装する方法の例を示します。
関連項目
インターフェイスのプロパティ (C# プログラミング ガイド)
インターフェイスでプロパティを宣言する方法について説明します。インターフェイスのインデクサ (C# プログラミング ガイド)
インターフェイスでインデクサを宣言する方法について説明します。方法 : インターフェイス イベントを実装する (C# プログラミング ガイド)
インターフェイスがイベントをどのように宣言するかを示します。クラスと構造体 (C# プログラミング ガイド)
C# がオブジェクト、クラス、および構造体をどのように使用するかを説明します。継承 (C# プログラミング ガイド)
C# が継承をどのように実装するかを説明します。メソッド (C# プログラミング ガイド)
C# プログラミング モデルでの名前付きメソッドの概念について説明します。ポリモーフィズム (C# プログラミング ガイド)
C# で複数の型としてクラスを使用する方法について説明します。抽象クラスとシール クラス、およびクラス メンバ (C# プログラミング ガイド)
abstract キーワードと sealed キーワードが継承にどのように影響するかを説明します。プロパティ (C# プログラミング ガイド)
C# でのプロパティの概念について説明します。イベント (C# プログラミング ガイド)
C# でのイベントの概念について説明します。インデクサ (C# プログラミング ガイド)
C# でのインデクサの概念について説明します。