インターフェイスInterfaces

インターフェイスは、他のクラスが実装する関連メンバーのセットを指定します。Interfaces specify sets of related members that other classes implement.

構文Syntax

// Interface declaration:
[ attributes ]
type [accessibility-modifier] interface-name =
    [ interface ]     [ inherit base-interface-name ...]
    abstract member1 : [ argument-types1 -> ] return-type1
    abstract member2 : [ argument-types2 -> ] return-type2
    ...
[ end ]

// Implementing, inside a class type definition:
interface interface-name with
    member self-identifier.member1argument-list = method-body1
    member self-identifier.member2argument-list = method-body2

// Implementing, by using an object expression:
[ attributes ]
let class-name (argument-list) =
    { new interface-name with
        member self-identifier.member1argument-list = method-body1
        member self-identifier.member2argument-list = method-body2
        [ base-interface-definitions ]
    }
    member-list

RemarksRemarks

インターフェイス宣言は、メンバーが実装されていないことを除いて、クラス宣言に似ています。Interface declarations resemble class declarations except that no members are implemented. 代わりに、キーワードabstractによって示されているように、すべてのメンバーが抽象型になります。Instead, all the members are abstract, as indicated by the keyword abstract. 抽象メソッドにメソッド本体を指定することはできません。You do not provide a method body for abstract methods. ただし、 defaultキーワードと共にメンバーの別の定義をメソッドとして含めることで、既定の実装を提供することもできます。However, you can provide a default implementation by also including a separate definition of the member as a method together with the default keyword. これは、他の .NET 言語で基底クラスの仮想メソッドを作成することと同じです。Doing so is equivalent to creating a virtual method in a base class in other .NET languages. このような仮想メソッドは、インターフェイスを実装するクラスでオーバーライドできます。Such a virtual method can be overridden in classes that implement the interface.

インターフェイスの既定のアクセシビリティはpublicです。The default accessibility for interfaces is public.

各メソッドのパラメーターに通常の F# 構文を使用して名前を付けることができます必要に応じて。You can optionally give each method parameter a name using normal F# syntax:

type ISprintable =
    abstract member Print : format:string -> unit

ISprintableの例Printでは、メソッドには、という名前formatstring型の1つのパラメーターがあります。In the above ISprintable example, the Print method has a single parameter of the type string with the name format.

インターフェイスを実装するには、オブジェクト式を使用する方法とクラス型を使用する方法の2つの方法があります。There are two ways to implement interfaces: by using object expressions, and by using class types. どちらの場合も、クラス型またはオブジェクト式は、インターフェイスの抽象メソッドにメソッド本体を提供します。In either case, the class type or object expression provides method bodies for abstract methods of the interface. 実装は、インターフェイスを実装する各型に固有です。Implementations are specific to each type that implements the interface. したがって、異なる型のインターフェイスメソッドは相互に異なる場合があります。Therefore, interface methods on different types might be different from each other.

簡易構文interfaceend使用する場合、定義の開始と終了をマークするキーワードとは省略可能です。The keywords interface and end, which mark the start and end of the definition, are optional when you use lightweight syntax. これらのキーワードを使用しない場合、コンパイラは、使用するコンストラクトを分析することで、型がクラスであるかインターフェイスであるかを推論しようとします。If you do not use these keywords, the compiler attempts to infer whether the type is a class or an interface by analyzing the constructs that you use. メンバーを定義する場合、または他のクラス構文を使用する場合、型はクラスとして解釈されます。If you define a member or use other class syntax, the type is interpreted as a class.

.NET のコーディングスタイルでは、すべてのインターフェイスを大文字Iで開始します。The .NET coding style is to begin all interfaces with a capital I.

クラス型を使用したインターフェイスの実装Implementing Interfaces by Using Class Types

次のコードに示すように、 interfaceキーワード、インターフェイスの名前、 withおよびキーワードを使用して、クラス型に1つ以上のインターフェイスを実装することができます。You can implement one or more interfaces in a class type by using the interface keyword, the name of the interface, and the with keyword, followed by the interface member definitions, as shown in the following code.

type IPrintable =
   abstract member Print : unit -> unit

type SomeClass1(x: int, y: float) =
   interface IPrintable with
      member this.Print() = printfn "%d %f" x y

インターフェイスの実装は継承されるため、派生クラスはそれらを再実装する必要はありません。Interface implementations are inherited, so any derived classes do not need to reimplement them.

インターフェイスメソッドの呼び出しCalling Interface Methods

インターフェイスメソッドを呼び出すことができるのは、インターフェイスを実装する型のオブジェクトではなく、インターフェイスのみです。Interface methods can be called only through the interface, not through any object of the type that implements the interface. そのため、これらのメソッドを呼び出すに:> upcastは、演算子または演算子を使用して、インターフェイス型にアップキャストすることが必要になる場合があります。Thus, you might have to upcast to the interface type by using the :> operator or the upcast operator in order to call these methods.

SomeClassのオブジェクトがある場合にインターフェイスメソッドを呼び出すには、次のコードに示すように、オブジェクトをインターフェイス型にアップキャストする必要があります。To call the interface method when you have an object of type SomeClass, you must upcast the object to the interface type, as shown in the following code.

let x1 = new SomeClass1(1, 2.0)
(x1 :> IPrintable).Print()

別の方法として、次の例のように、キャストしてインターフェイスメソッドを呼び出すオブジェクトに対してメソッドを宣言する方法があります。An alternative is to declare a method on the object that upcasts and calls the interface method, as in the following example.

type SomeClass2(x: int, y: float) =
   member this.Print() = (this :> IPrintable).Print()
   interface IPrintable with
      member this.Print() = printfn "%d %f" x y

let x2 = new SomeClass2(1, 2.0)
x2.Print()

オブジェクト式を使用したインターフェイスの実装Implementing Interfaces by Using Object Expressions

オブジェクト式は、インターフェイスを実装するための簡単な方法を提供します。Object expressions provide a short way to implement an interface. これらは、名前付きの型を作成する必要がなく、インターフェイスメソッドをサポートするオブジェクトを必要とする場合に、追加のメソッドを使用しない場合に便利です。They are useful when you do not have to create a named type, and you just want an object that supports the interface methods, without any additional methods. オブジェクト式を次のコードに示します。An object expression is illustrated in the following code.

let makePrintable(x: int, y: float) =
    { new IPrintable with
              member this.Print() = printfn "%d %f" x y }
let x3 = makePrintable(1, 2.0)
x3.Print()

インターフェイスの継承Interface Inheritance

インターフェイスは、1つまたは複数の基本インターフェイスから継承できます。Interfaces can inherit from one or more base interfaces.

type Interface1 =
    abstract member Method1 : int -> int

type Interface2 =
    abstract member Method2 : int -> int

type Interface3 =
    inherit Interface1
    inherit Interface2
    abstract member Method3 : int -> int

type MyClass() =
    interface Interface3 with
        member this.Method1(n) = 2 * n
        member this.Method2(n) = n + 100
        member this.Method3(n) = n / 10

関連項目See also