次の方法で共有


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

更新 : 2010 年 7 月

インターフェイスは、任意のクラスまたは構造体に属する関連機能のグループを表します。 インターフェイスは、次の例に示すように、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;
        }
    }
    

IEquatable<T> インターフェイスが実装されている場合、オブジェクトのユーザーには、そのオブジェクトが同じ型の他のオブジェクトと等しいかどうかを、オブジェクト自身が判断できるということがわかります。インターフェイスのユーザーは、これがどのように実装されているかを理解する必要はありません。

インターフェイス メンバーを実装するには、クラスの対応するメンバーは、パブリックかつ非静的であり、その名前とシグネチャがインターフェイス メンバーと一致する必要があります。 クラスのプロパティとインデクサーでは、インターフェイスで定義されているプロパティまたはインデクサーに追加のアクセサーを定義できます。 たとえば、インターフェイスでは、get アクセサーを持つプロパティが宣言されることがあります。 このインターフェイスを実装するクラスでは、get アクセサーと set アクセサーの両方を使用して、同じプロパティを宣言できます。 ただし、プロパティやインデクサーで明示的な実装を使用する場合は、アクセサーを一致させる必要があります。 明示的な実装の詳細については、「インターフェイスのプロパティ (C# プログラミング ガイド)」を参照してください。

インターフェイスとインターフェイス メンバーは抽象であり、インターフェイスは既定の実装を提供しません。 詳細については、「抽象クラスとシール クラス、およびクラス メンバー (C# プログラミング ガイド)」を参照してください。

インターフェイスは、他のインターフェイスを継承できます。 クラスでは、継承する基本クラスを介して、または他のインターフェイスによって継承されるインターフェイスを介して、インターフェイスを複数回継承できます。 ただし、クラスでインターフェイスを実装するのは 1 回に限られ、それもインターフェイスが class ClassName : InterfaceName のように、クラスの定義の一部として宣言される場合に限られます。 インターフェイスを実装する基本クラスを継承したためにインターフェイスが継承された場合、インターフェイスの実装は基本クラスによって提供されます。 基本クラスでは、仮想メンバーを使用してインターフェイス メンバーを実装することもできます。 この場合、仮想メンバーをオーバーライドすることにより、派生クラスでインターフェイスの動作を変更できます。 仮想メンバーの詳細については、「ポリモーフィズム」を参照してください。

インターフェイスの概要

インターフェイスには、次の特徴があります。

  • インターフェイスは抽象基本クラスに似ています。インターフェイスを実装する非抽象型は、すべてのインターフェイス メンバーを実装する必要があります。

  • インターフェイスは直接インスタンス化できません。

  • インターフェイスには、イベント、インデクサー、メソッド、およびプロパティを含めることができます。

  • インターフェイスには、メソッドの実装が含まれません。

  • クラスと構造体は、複数のインターフェイスを実装できます。

  • インターフェイス自体が複数のインターフェイスを継承できます。

このセクションの内容

関連項目

参考書籍の該当する章

Learning C# 3.0: Master the Fundamentals of C# 3.0』の「Interfaces

参照

参照

継承 (C# プログラミング ガイド)

概念

C# プログラミング ガイド

履歴の変更

日付

履歴

理由

2010 年 7 月

実装と継承の区別を明確化。 インターフェイスに含められるものと含められないものとを明記。

カスタマー フィードバック