Fsharp-interfaces
提供:Dev Guides
F#-インターフェース
インターフェイスは、クラスの実装の詳細を記述する抽象的な方法を提供します。 クラスが実装し、公開する必要があるメソッドを宣言するテンプレートです。
構文
インターフェイスは、他のクラスが実装する関連メンバーのセットを指定します。 次の構文があります-
//Interface declaration:
[ attributes ]
type 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.member1 argument-list = method-body1
member self-identifier.member2 argument-list = method-body2
//Implementing, by using an object expression:
[ attributes ]
let class-name (argument-list) =
{ new interface-name with
member self-identifier.member1 argument-list = method-body1
member self-identifier.member2 argument-list = method-body2
[ base-interface-definitions ]
}
member-list
注意してください-
- インターフェイス宣言では、メンバーは実装されていません。
- メンバーは抽象的で、 abstract キーワードによって宣言されます。 ただし、 default キーワードを使用してデフォルトの実装を提供できます。
- インターフェイスを実装するには、オブジェクト式を使用するか、クラス型を使用します。
- クラスまたはオブジェクトの実装では、インターフェイスの抽象メソッドのメソッド本体を提供する必要があります。
- 定義の開始と終了を示すキーワード interface と end はオプションです。
例えば、
type IPerson =
abstract Name : string
abstract Enter : unit -> unit
abstract Leave : unit -> unit
インターフェイスメソッドの呼び出し
インターフェイスメソッドは、インターフェイスを実装するクラスまたは型のインスタンスではなく、インターフェイスを介して呼び出されます。 インターフェイスメソッドを呼び出すには、*:> *演算子(アップキャスト演算子)を使用してインターフェイスタイプにキャストします。
例えば、
(s :> IPerson).Enter()
(s :> IPerson).Leave()
次の例は、概念を示しています-
例
type IPerson =
abstract Name : string
abstract Enter : unit -> unit
abstract Leave : unit -> unit
type Student(name : string, id : int) =
member this.ID = id
interface IPerson with
member this.Name = name
member this.Enter() = printfn "Student entering premises!"
member this.Leave() = printfn "Student leaving premises!"
type StuffMember(name : string, id : int, salary : float) =
let mutable _salary = salary
member this.Salary
with get() = _salary
and set(value) = _salary <- value
interface IPerson with
member this.Name = name
member this.Enter() = printfn "Stuff member entering premises!"
member this.Leave() = printfn "Stuff member leaving premises!"
let s = new Student("Zara", 1234)
let st = new StuffMember("Rohit", 34, 50000.0)
(s :> IPerson).Enter()
(s :> IPerson).Leave()
(st :> IPerson).Enter()
(st :> IPerson).Leave()
あなたがプログラムをコンパイルして実行すると、次の出力が得られます-
Student entering premises!
Student leaving premises!
Stuff member entering premises!
Stuff member leaving premises!
インターフェースの継承
インターフェイスは、1つ以上のベースインターフェイスから継承できます。
次の例は、概念を示しています-
type Interface1 =
abstract member doubleIt: int -> int
type Interface2 =
abstract member tripleIt: int -> int
type Interface3 =
inherit Interface1
inherit Interface2
abstract member printIt: int -> string
type multiplierClass() =
interface Interface3 with
member this.doubleIt(a) = 2 *a
member this.tripleIt(a) = 3* a
member this.printIt(a) = a.ToString()
let ml = multiplierClass()
printfn "%d" ((ml:>Interface3).doubleIt(5))
printfn "%d" ((ml:>Interface3).tripleIt(5))
printfn "%s" ((ml:>Interface3).printIt(5))
あなたがプログラムをコンパイルして実行すると、次の出力が得られます-
10
15
5