interface (C# リファレンス)interface (C# Reference)

インターフェイスによりコントラクトが定義されます。An interface defines a contract. そのコントラクトを実装する class または struct では、インターフェイスで定義されているメンバーを実装する必要があります。Any class or struct that implements that contract must provide an implementation of the members defined in the interface. C# 8.0 以降では、インターフェイスによってメンバーの既定の実装を定義できます。Beginning with C# 8.0, an interface may define a default implementation for members. 共通の機能を 1 回で実装する目的で static メンバーも定義できます。It may also define static members in order to provide a single implementation for common functionality.

次の例の ImplementationClass クラスは、SampleMethod を返す、パラメーターのない void メソッドを実装する必要があります。In the following example, class ImplementationClass must implement a method named SampleMethod that has no parameters and returns void.

使用例を含む詳細については、「インターフェイス」を参照してください。For more information and examples, see Interfaces.

Example

interface ISampleInterface
{
    void SampleMethod();
}

class ImplementationClass : ISampleInterface
{
    // Explicit interface member implementation:
    void ISampleInterface.SampleMethod()
    {
        // Method implementation.
    }

    static void Main()
    {
        // Declare an interface instance.
        ISampleInterface obj = new ImplementationClass();

        // Call the member.
        obj.SampleMethod();
    }
}

インターフェイスには、名前空間またはクラスのメンバーを指定できます。An interface can be a member of a namespace or a class. インターフェイス宣言には、次のメンバーの宣言を含めることができます (実装なしのシグネチャ)。An interface declaration can contain declarations (signatures without any implementation) of the following members:

これらのメンバー宣言には通常、本文が含まれません。These preceding member declarations typically do not contain a body. C# 8.0 以降では、インターフェイス メンバーで本文を宣言できます。Beginning with C# 8.0, an interface member may declare a body. これは 既定の実装 と呼ばれています。This is called a default implementation. 本文のあるメンバーでは、実装がオーバーライドされないクラスおよび構造体に "既定の" 実装を与えることがインターフェイスに許可されます。Members with bodies permit the interface to provide a "default" implementation for classes and structs that don't provide an overriding implementation. また、C# 8.0 以降、インターフェイスには次を含めることができます。In addition, beginning with C# 8.0, an interface may include:

インターフェイスには、インスタンスの状態を含めることはできません。Interfaces may not contain instance state. 静的フィールドが許可されるようになりましたが、インスタンス フィールドはインターフェイスでは許可されません。While static fields are now permitted, instance fields are not permitted in interfaces. インスタンスの自動プロパティでは暗黙的に隠しフィールドが宣言されることがあり、インターフェイスではサポートされていません。Instance auto-properties are not supported in interfaces, as they would implicitly declare a hidden field. このルールは、プロパティの宣言に微細な影響を与えます。This rule has a subtle effect on property declarations. インターフェイス宣言では、次のコードによって、classstruct の場合のように自動実装プロパティが宣言されることはありません。In an interface declaration, the following code does not declare an auto-implemented property as it does in a class or struct. その代わり、既定の実装が与えられないが、インターフェイスを実装する何らかの型で実装する必要があるプロパティが宣言されます。Instead, it declares a property that doesn't have a default implementation but must be implemented in any type that implements the interface:

public interface INamed
{
  public string Name {get; set;}
}

インターフェイスは、1 つ以上の基底インターフェイスから継承できます。An interface can inherit from one or more base interfaces. あるインターフェイスで基底インターフェイスに実装されているメソッドがオーバーライドされるとき、そのインターフェイスでは明示的なインターフェイス実装構文を使用する必要があります。When an interface overrides a method implemented in a base interface, it must use the explicit interface implementation syntax.

基本型のリストに基底クラスとインターフェイスが含まれる場合は、基底クラスがリストの最初に表示されます。When a base type list contains a base class and interfaces, the base class must come first in the list.

インターフェイスを実装するクラスは、そのインターフェイスのメンバーを明示的に実装できます。A class that implements an interface can explicitly implement members of that interface. 明示的に実装されているメンバーには、クラス インスタンスではアクセスできません。インターフェイスのインスタンスを使用した場合にのみアクセスできます。An explicitly implemented member cannot be accessed through a class instance, but only through an instance of the interface. また、既定のインターフェイス メンバーには、インターフェイスのインスタンス経由でのみアクセスできます。In addition, default interface members can only be accessed through an instance of the interface.

明示的なインターフェイス実装の詳細については、「明示的なインターフェイスの実装」を参照してください。For more information about explicit interface implementation, see Explicit Interface Implementation.

Example

ここでは、インターフェイスの実装例を示します。The following example demonstrates interface implementation. この例では、インターフェイスにプロパティ宣言が含まれ、クラスに実装が含まれます。In this example, the interface contains the property declaration and the class contains the implementation. IPoint を実装するクラスのインスタンスには、整数プロパティ x および y が含まれています。Any instance of a class that implements IPoint has integer properties x and y.

interface IPoint
{
   // Property signatures:
   int X
   {
      get;
      set;
   }

   int Y
   {
      get;
      set;
   }

   double Distance
   {
       get;
   }
}

class Point : IPoint
{
   // Constructor:
   public Point(int x, int y)
   {
      X = x;
      Y = y;
   }

   // Property implementation:
   public int X { get; set; }

   public int Y { get; set; }

   // Property implementation
   public double Distance =>
      Math.Sqrt(X * X + Y * Y);

}

class MainClass
{
   static void PrintPoint(IPoint p)
   {
      Console.WriteLine("x={0}, y={1}", p.X, p.Y);
   }

   static void Main()
   {
      IPoint p = new Point(2, 3);
      Console.Write("My Point: ");
      PrintPoint(p);
   }
}
// Output: My Point: x=2, y=3

C# 言語仕様C# language specification

詳細については、C# 言語仕様の「インターフェイス」セクションと C# 8.0 の既定のインターフェイス メンバーに関するページを参照してください。For more information, see the Interfaces section of the C# language specification and the feature specification for Default interface members - C# 8.0

関連項目See also