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
這是最後一份筆記了&nbsp; 新關鍵字是abstract,mutable 還有&lt;-&nbsp; 十分難以理解的東西, 先從介面定義開始說起&nbsp; abstract Peek: 是輸入unit 而輸出int,&nbsp; unit 是一個特別的值, 這在functional 語言中十分常見, 要說定義的話, 就是它只有一個叫() 或者叫null 的值那就是說是不用輸入 Poke 則是相反, 輸入int 而不作出回應 &nbsp; 實作時: 把initialState 放進去, mutable 是F#的關鍵字, 用途是令state 可以裡重新assign (發現以前的都不可以了吧@@ 就是如果mutable 不放進去的話, 是沒法像其他語言那樣a=1 然後a=2 的, 說起來functional 語言很像算式, 但這樣想的話它就不能用來推動任何東西了, 我也就在吐嘈)&nbsp; interface IPeekPoke with &nbsp;member ....member 只可以是在abstract 中提過的成員&nbsp; Poke 會輸入n 然後state 變為state+n Peek 是回傳state &nbsp; :&gt; 用法是 class(params) :&gt; interface, interface 是強制的, 像是宣告型態一樣, 就當給自己提示吧