9.4 具體的物件型別
物件導向程式設計中的最重要的結構,就是類的宣告。它的價值體現用 f# 寫的庫,可以在 c# 中使用,因為從 c# 中引用f# 宣告的類時,看起來就像普通的類。從概念上講,類有一點像帶成員的記錄,因為,它們把值儲存在字段中,並提供成員進行訪問;類還有另外的功能,在 f# 中,出現下列情況,通常使用類:
■ 需要封裝資料和行為時。
■ 在迭代開發過程的後期,把簡單的元組或記錄轉換成更進化的型別,以隱藏內部實現。
■當型別需要在構造器的內部執行一些計算時。
當需要設計可擴充套件的型別,支援新增操作時,不要使用類;實現繼承和虛擬方法很少使用。
我們先看乙個可能是最簡單的例子。清單 9.14 顯示了乙個有建構函式的類宣告,它有幾個屬性和乙個方法。
清單 9.14 帶有客戶資訊的類 (f# interactive)
> type clientinfo(name, income, years)= [1]
letloancoefficient = income / 5000 * years | 在構造時執行
do printfn"creating client '%s'" name |
member x.name =name |
member x.income =income | [2]
member x.years =years |
member x.report()= | [3]
printfn "client: %s, loan coefficient: %d" name loancoefficient |
type clientinfo = (...)
> let john = new clientinfo("johndoe", 40000, 2);; <-- 建立類,執行建構函式
val john : clientinfo
creating client 'john doe'
> john.report();; <-- 呼叫類的方法
client: john doe, q=16
val it : unit = ()
類宣告的開始是類的名字和構造函式引數[1]。接下來的幾行,直到第乙個成員宣告之前,都會在構造期間執行;這部分**構成了隱式建構函式(implicit constructor)。建構函式的引數(如 name 等)和在初始化**中宣告的值(如 loancoefficient),在類的內部任何地方都可以訪問;這是非常有用的,因為,c# 的建構函式通常只複製其引數值給私有字段,因此,它們能夠從其他地方訪問。如果只在建構函式**內部使用引數,就不儲存為字段,因為,編譯器知道不再需要它。
接下來,是類宣告的三個成員,把建構函式的引數值公開為客戶的屬性[2],和乙個方法[3]。就像在f# 的資料型別上新增成員一樣,字首 x. 表示類的當前例項,可以使用值 x 來訪問;我們可能會用它來呼叫其他方法,或者讀其他屬性。
注意f# 提供宣告類的功能,要比我們在這個例子中看到豐富得多。f# 語言的目標是成為.net 的一等公民(first-class .net citizen),所以,在 c# 幾乎所有能用的,都可以轉換到 f#;然而,在通常的 f# 程式設計中,我們並不需要高階的 .net 物件模型的功能,比如,過載建構函式(overloaded constructors)、過載方法(overloadedmethods),還有,公開訪問字段。
本書的目的是介紹函式式概念,而不是解釋每一項 f# 功能,因此,我們只討論 f# 提供的最有用的物件導向的構造,看它們如何使用函式風格。要找到更多關於類宣告的資訊,可以瀏覽本書的**,另外,還可以參考本書結尾的參考資料一節中提到的 [f# 文件] 和 [f# 語言規範] 。
前面示例中的類仍然是純函式式的,因此,它沒有任何可變狀態;這說明了物件導向和函式正規化是可以很好地結合在一起的。
04具體分析
思路 使用order by按照views欄位做乙個全域性排序即可,同時我們設定只顯示前10條。select videoid,uploader,age,category,length,views,rate,ratings,comments from gulivideo orc order by vie...
AJAX(2) 具體使用
同步 sync 持續等待,直到操作完成,已經過時了,執行會警告 非同步 async 在執行一些耗時的操作時候去做別的事情,而不是等待 區別在於 send 方法是否出現等待的情況 非同步 open方法的第三個引數為布林值,預設是true,代表的是非同步 xhrasync.open get time.p...
Windows系統安裝MySQL8 0具體步驟
僅當記錄一下 如果以前裝過mysql,注意後面2.1步驟中port選擇不能填3306,可以選擇其他系統未用的埠。而如果要解除安裝之前的mysql,主要是刪除mysql服務 net stop mysql,sc delete mysql 不然會自動啟動以前的mysql服務,導致新版執行不了。刪除具體步驟...