2013-07-16 104 views
9

OCaml中的模塊和類有什麼區別。OCaml中的模塊和類

從我的搜索,我發現這一點:

無論是對抽象和封裝提供機制, 亞型(通過省略對象的方法,而忽略在 模塊連接的視場),以及繼承(對象使用繼承;模塊使用 include)。但是,這兩個系統沒有可比性。一方面,對象具有優勢:對象是一級 值,而模塊不是 - 換句話說,模塊不支持 動態查找。另一方面,模塊有一個優點:模塊 可以包含類型定義,而對象不能。

首先,我不明白「模塊不支持動態查找」是什麼意思。從我的角度來看,抽象和多態意味着父指針可以引用一個子實例。這是「動態查找」嗎?如果不是,實際上動態查找的含義是什麼?

實際上,我們什麼時候選擇使用Module和Class?

回答

8

從實踐的角度來看,動態查找可以讓您使用相同的方法擁有不同的對象,而無需指定它屬於哪個類/模塊。它可以幫助你使用繼承。

例如,讓我們使用兩個數據結構:SingleListDoubleLinkedList,其,兩者的,從List繼承和具有方法pop。每個類都有自己的方法實現(因爲'覆蓋')。

因此,當您想要調用它時,當您執行list#pop時,該方法的查找在運行時完成(又名動態)。

如果您使用的是模塊,則必須使用SingleList.pop listDoubleLinkedList.pop list

編輯:正如@ Majestic12所說,大多數時候,OCaml用戶傾向於在類上使用模塊。當他們需要繼承或實例時使用第二個(檢查他的答案)。

我想讓描述具有實用性,因爲您對OCaml看起來很陌生。

希望它能幫助你。

11

模塊和類之間的主要區別在於您沒有實例化模塊。

模塊基本上只是一個「抽屜」,您可以在其中放置類型,函數,其他模塊等......它只是在這裏訂購代碼。然而這個抽屜真的很強大,這要歸功於功能。

另一方面,類存在被實例化。它們包含變量和方法。你可以從一個類創建一個對象,並且每個對象都包含它自己的變量和方法(在類中定義)。

實際上,使用模塊在大多數情況下都是很好的解決方案。當需要繼承時,一個類可能很有用(例如,小部件)。