インターフェイス (C# プログラミング ガイド)Interfaces (C# Programming Guide)

インターフェイスには、クラスまたは構造体で実装できる関連機能のグループの定義が含まれます。An interface contains definitions for a group of related functionalities that a class or a struct can implement.

インターフェイスを使用すると、たとえば、クラス内の複数のソースからの動作を含めることができます。By using interfaces, you can, for example, include behavior from multiple sources in a class. C# ではクラスの複数の継承がサポートされないため、この機能は重要です。That capability is important in C# because the language doesn't support multiple inheritance of classes. また、構造体の継承をシミュレートする場合はインターフェイスを使用する必要があります。これは、実際に別の構造体またはクラスから継承することができないためです。In addition, you must use an interface if you want to simulate inheritance for structs, because they can't actually inherit from another struct or class.

interface キーワードを使用してインターフェイスを定義します。You define an interface by using the interface keyword. 次の例のようにします。as the following example shows.

interface IEquatable<T>
{
    bool Equals(T obj);
}

構造体の名前を、有効な C# の識別子名にする必要があります。The name of the struct must be a valid C# identifier name. 慣例により、インターフェイス名は大文字の I で始めます。By convention, interface names begin with a capital I.

IEquatable<T> インターフェイスを実装するすべてのクラスまたは構造体は、インターフェイスで指定されたシグネチャに一致する Equals メソッドの定義を含む必要があります。Any class or struct that implements the IEquatable<T> interface must contain a definition for an Equals method that matches the signature that the interface specifies. したがって、IEquatable<T> を実装するクラスが Equals メソッドを含むと想定したうえで、これを使用してクラスの 1 つのインスタンスが同じクラスの別のインスタンスと等しいかどうかを判定できます。As a result, you can count on a class that implements IEquatable<T> to contain an Equals method with which an instance of the class can determine whether it's equal to another instance of the same class.

IEquatable<T> の定義は Equals の実装を提供しません。The definition of IEquatable<T> doesn’t provide an implementation for Equals. クラスまたは構造体には複数のインターフェイスを実装できます。ただし、クラスは 1 つのクラスからのみ継承できます。A class or struct can implement multiple interfaces, but a class can only inherit from a single class.

抽象クラスの詳細については、「抽象クラスとシール クラス、およびクラス メンバー」を参照してください。For more information about abstract classes, see Abstract and Sealed Classes and Class Members.

インターフェイスには、メソッド、プロパティ、イベント、インデクサー、またはこれらの 4 種類のメンバーの任意の組み合わせを含めることができます。Interfaces can contain methods, properties, events, indexers, or any combination of those four member types. 例へのリンクについては、「関連項目」を参照してください。For links to examples, see Related Sections. インターフェイスには、定数、フィールド、演算子、インスタンス コンストラクター、ファイナライザー、または型を含めることはできません。An interface can't contain constants, fields, operators, instance constructors, finalizers, or types. インターフェイスのメンバーは、自動的にパブリックに設定され、アクセス修飾子を含むことはできません。Interface members are automatically public, and they can't include any access modifiers. メンバーを static として宣言することもできません。Members also can't be static.

インターフェイスのメンバーを実装するには、実装するクラスの対応するメンバーがパブリックかつ非静的であり、インターフェイスのメンバーと同じ名前および署名を持つ必要があります。To implement an interface member, the corresponding member of the implementing class must be public, non-static, and have the same name and signature as the interface member.

クラスまたは構造体でインターフェイスを実装するときは、インターフェイスで定義されているすべてのメンバーの実装を提供する必要があります。When a class or struct implements an interface, the class or struct must provide an implementation for all of the members that the interface defines. インターフェイス自体は、基本クラスの機能を継承できるようにクラスまたは構造体が継承できる機能を提供しません。The interface itself provides no functionality that a class or struct can inherit in the way that it can inherit base class functionality. ただし、基本クラスでインターフェイスが実装される場合、その基本クラスから派生するすべてのクラスはその実装を継承します。However, if a base class implements an interface, any class that's derived from the base class inherits that implementation.

IEquatable<T> インターフェイスを実装する例を次に示します。The following example shows an implementation of the IEquatable<T> interface. 実装するクラスの Car は、Equals メソッドの実装を提供する必要があります。The implementing class, Car, must provide an implementation of the Equals method.

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)
    {
        return this.Make == car.Make &&
               this.Model == car.Model &&
               this.Year == car.Year;
    }
}

クラスのプロパティとインデクサーでは、インターフェイスに定義されているプロパティまたはインデクサーの追加のアクセサーを定義できます。Properties and indexers of a class can define extra accessors for a property or indexer that's defined in an interface. たとえば、インターフェイスで get アクセサーを持つプロパティを宣言するとします。For example, an interface might declare a property that has a get accessor. このインターフェイスを実装するクラスでは、get アクセサーと set アクセサーの両方を持つ同じプロパティを宣言できます。The class that implements the interface can declare the same property with both a get and set accessor. ただし、プロパティまたはインデクサーで明示的な実装を使用する場合は、これらのアクセサーが一致する必要があります。However, if the property or indexer uses explicit implementation, the accessors must match. 明示的な実装の詳細については、「明示的なインターフェイス実装」および「インターフェイスのプロパティ」を参照してください。For more information about explicit implementation, see Explicit Interface Implementation and Interface Properties.

インターフェイスは、他のインターフェイスから継承できます。Interfaces can inherit from other interfaces. クラスは、継承する基底クラス、または他のインターフェイスが継承するインターフェイスを介して、インターフェイスを複数回含めることができます。A class might include an interface multiple times through base classes that it inherits or through interfaces that other interfaces inherit. ただし、クラスでインターフェイスの実装を提供できるのは 1 回のみであり、それもクラスでクラスの定義の一部としてインターフェイスを宣言する場合 (class ClassName : InterfaceName) に限られます。However, the class can provide an implementation of an interface only one time and only if the class declares the interface as part of the definition of the class (class ClassName : InterfaceName). インターフェイスを実装する基本クラスを継承することによってインターフェイスを継承する場合、基本クラスは、そのインターフェイスのメンバーの実装を提供します。If the interface is inherited because you inherited a base class that implements the interface, the base class provides the implementation of the members of the interface. ただし、派生クラスでは、継承された実装を使用する代わりに、任意の仮想インターフェイスのメンバーを再実装できます。However, the derived class can reimplement any virtual interface members instead of using the inherited implementation.

また、基本クラスでは、仮想メンバーを使用して、インターフェイスのメンバーを実装することもできます。A base class can also implement interface members by using virtual members. その場合、派生クラスでは、仮想メンバーをオーバーライドすることでインターフェイスの動作を変更できます。In that case, a derived class can change the interface behavior by overriding the virtual members. 仮想メンバーの詳細については、「ポリモーフィズム」を参照してください。For more information about virtual members, see Polymorphism.

インターフェイスの概要Interfaces summary

インターフェイスは、次の特性を持ちます。An interface has the following properties:

  • インターフェイスは、抽象メンバーのみを含む抽象基本クラスに似ています。An interface is like an abstract base class with only abstract members. インターフェイスを実装するすべてのクラスまたは構造体では、そのすべてのメンバーを実装する必要があります。Any class or struct that implements the interface must implement all its members.
  • インターフェイスを直接インスタンス化することはできません。An interface can't be instantiated directly. そのメンバーは、インターフェイスを実装する任意のクラスまたは構造体によって実装されます。Its members are implemented by any class or struct that implements the interface.
  • インターフェイスには、イベント、インデクサー、メソッド、およびプロパティを含めることができます。Interfaces can contain events, indexers, methods, and properties.
  • インターフェイスには、メソッドの実装は含まれません。Interfaces contain no implementation of methods.
  • クラスまたは構造体は、複数のインターフェイスを実装できます。A class or struct can implement multiple interfaces. クラスは、基本クラスを継承する一方で、1 つまたは複数のインターフェイスを実装できます。A class can inherit a base class and also implement one or more interfaces.

このセクションの内容In this section

明示的なインターフェイスの実装Explicit Interface Implementation
インターフェイスに固有のクラス メンバーを作成する方法について説明します。Explains how to create a class member that’s specific to an interface.

方法: インターフェイス メンバーを明示的に実装するHow to: Explicitly Implement Interface Members
インターフェイスのメンバーを明示的に実装する方法の例を示します。Provides an example of how to explicitly implement members of interfaces.

方法: 2 つのインターフェイスのメンバーを明示的に実装するHow to: Explicitly Implement Members of Two Interfaces
継承を持つインターフェイスのメンバーを明示的に実装する方法の例を示します。Provides an example of how to explicitly implement members of interfaces with inheritance.

関連項目Related Sections

インターフェイス」(『Learning C# 3.0: Master the fundamentals of C# 3.0 (C# 3.0 の学習: C# 3.0 の基礎を習得)』)Interfaces in Learning C# 3.0: Master the Fundamentals of C# 3.0

関連項目See also