- F# 基礎教程
- F# - 首頁
- F# - 概述
- F# - 環境搭建
- F# - 程式結構
- F# - 基本語法
- F# - 資料型別
- F# - 變數
- F# - 運算子
- F# - 決策
- F# - 迴圈
- F# - 函式
- F# - 字串
- F# - 可選項
- F# - 元組
- F# - 記錄
- F# - 列表
- F# - 序列
- F# - 集合
- F# - 對映
- F# - 判別聯合
- F# - 可變資料
- F# - 陣列
- F# - 可變列表
- F# - 可變字典
- F# - 基本I/O
- F# - 泛型
- F# - 委託
- F# - 列舉
- F# - 模式匹配
- F# - 異常處理
- F# - 類
- F# - 結構體
- F# - 運算子過載
- F# - 繼承
- F# - 介面
- F# - 事件
- F# - 模組
- F# - 名稱空間
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!
介面繼承
介面可以繼承一個或多個基介面。
以下示例顯示了該概念:
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
廣告