2016-11-20 55 views
1

我學習Clojure的,我想知道如何處理用Clojure OO類的子類。例如:一個主抽象類,兩個抽象子類(每個都重新定義了一些函數),在第三級中創建將在函數中使用的「對象」的最終子類。不知道如何做到這一點。但是,我設法用一個抽象類來完成一個子類,並使用defprotocol和defrecord。但是我不能在另一個內部實現一個協議。由於子類Clojure中

+1

創建一個協議作爲一個抽象基類,然後定義表示每個新的「層次」的協議。記錄可以實現多個協議,所以這應該起作用。 – Carcigenicate

+0

也許是相關的:http://clojure.org/reference/multimethods(尤其是Clojure避開傳統OO方法的部分,但你可以通過不同的方式實現多態)。 –

+0

@Carcigenicate的事情是,我需要記錄來實現一個協議,這將帶來它的基礎協議。例如:我有7類的順序: A-> B A->Ç 乙 - > d B->電子 C->˚F C-「G 而對於B和C,他們需要重新定義A – juanimoli

回答

6

你不需要類或子類。將您的數據表示爲具有屬性的地圖。 「子類」可能有更多的屬性。

如果您有關於屬性變化的函數,則既可以使用基於屬性的條件邏輯(如果,標準條件等),或者使用基於多方法或協議多態性,如果你真的需要。

在矩陣的話,沒有勺子。

+0

我真的需要研究多種方法中的一種。我一直在寫Clojure近半年,現在還沒有碰到它們。 – Carcigenicate

2

你可以繼承像這樣的協議:

(extend <subtype> 
    <protocol> 
    (merge (get-in <protocol> [:impls <basetype>]) 
     <map-of-redefined-methods>)) 

多方法提供與derive繼承的直接支持。

實際的Java子類關係可以用:extends關鍵字指定爲gen-class。不過,這僅僅意味着Java互操作。

一般情況下,它是值得一試,你是否真的需要繼承。它通常不是Clojure中建模的首選方法。