接口提供了一種抽象的方式來描述類的實現(xiàn)細節(jié)。 它是一個模板,聲明類必須實現(xiàn)和公開公開的方法。
語法
接口指定其他類實現(xiàn)的相關成員集。 它有以下語法
// 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
請注意
1、在接口聲明中,成員未實現(xiàn)。
2、成員是抽象的,由
default關鍵字聲明。 但是,您可以使用
default關鍵字提供默認實現(xiàn)。
3、您可以通過使用對象表達式或使用類類型實現(xiàn)接口。
4、在類或?qū)ο髮崿F(xiàn)中,您需要為接口的抽象方法提供方法體。
5、關鍵字
interface和
end(標記定義的開始和結束)是可選的。
例如,
type IPerson =
abstract Name : string
abstract Enter : unit -> unit
abstract Leave : unit -> unit
調(diào)用接口方法
接口方法通過接口調(diào)用,而不是通過實例的類或類型實現(xiàn)接口。 要調(diào)用接口方法,您可以使用:>運算符(upcast運算符)轉(zhuǎn)換為接口類型。
例如,
(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()
當你編譯和執(zhí)行程序,它產(chǎn)生以下輸出
Student entering premises!
Student leaving premises!
Stuff member entering premises!
Stuff member leaving premises!
接口繼承
接口可以從一個或多個基本接口繼承。
下面的例子顯示的概念
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))
當你編譯和執(zhí)行程序,它產(chǎn)生以下輸出
10
15
5