F# 學習筆記 7 介面
2013-03-06
// 型別: 介面
// ---------------------------------------------------------------
type IPeekPoke =
abstract Peek: unit -> int
abstract Poke: int -> unit
// 型別: 含介面實作的類別
// ---------------------------------------------------------------
/// 計算自身被查詢次數的 Widget
type Widget(initialState:int) =
/// Widget 的內部狀態
let mutable state = initialState
// 實作 IPeekPoke 介面
interface IPeekPoke with
member x.Poke(n) = state <- state + n
member x.Peek() = state
/// Widget 被查詢過嗎?
member x.HasBeenPoked = (state <> 0)
let widget = Widget(12) :> IPeekPoke
widget.Poke(4)
let peekResult = widget.Peek()
// 列印
// ---------------------------------------------------------------
// 列印整數
printfn "peekResult = %d" peekResult
// 使用 %A 列印結果以進行一般列印
printfn "listC = %A" listC
這是最後一份筆記了
新關鍵字是abstract,mutable 還有<-
十分難以理解的東西, 先從介面定義開始說起
abstract Peek: 是輸入unit 而輸出int,
unit 是一個特別的值, 這在functional 語言中十分常見, 要說定義的話, 就是它只有一個叫() 或者叫null 的值那就是說是不用輸入 Poke 則是相反, 輸入int 而不作出回應
實作時: 把initialState 放進去, mutable 是F#的關鍵字, 用途是令state 可以裡重新assign (發現以前的都不可以了吧@@ 就是如果mutable 不放進去的話, 是沒法像其他語言那樣a=1 然後a=2 的, 說起來functional 語言很像算式, 但這樣想的話它就不能用來推動任何東西了, 我也就在吐嘈)
interface IPeekPoke with member ....member 只可以是在abstract 中提過的成員
Poke 會輸入n 然後state 變為state+n Peek 是回傳state
:> 用法是 class(params) :> interface, interface 是強制的, 像是宣告型態一樣, 就當給自己提示吧