2016-05-31 37 views
3

在REPL以下工作:當他們都生活在不同的文件中時,如何將兩個deftypes組合成新的deftype?

(defprotocol MyProtocol 
    (foo [this])) 
(deftype A [] 
    MyProtocol 
    (foo [this] "a")) 
(deftype B [] 
    MyProtocol 
    (foo [this] "b")) 
(deftype C [] 
    MyProtocol 
    (foo [this] (str (foo (A.)) (foo (B.))))) 

當我嘗試每個實例移動到一個單獨的文件,以減少耦合,然後我得到C以下錯誤:「無法解析符號:FOO在這種情況下「

樣品佈局:

;; my_protocol.clj 
(ns my-protocol) 
(defprotocol MyProtocol 
    (foo [this])) 

;; type_a.clj 
(ns type-a 
    (:require my-protocol :refer [MyProtocol]) 
(deftype A [] 
    MyProtocol 
    (foo [this] "a")) 

;; type_b.clj 
(ns type-b 
    (:require my-protocol :refer [MyProtocol]) 
(deftype B [] 
    MyProtocol 
    (foo [this] "b")) 

;; type_c.clj 
(ns type-c 
    (:import [type_a A] 
      [type_b B]) 
    (:require my-protocol :refer [MyProtocol]) 
(deftype C [] 
    MyProtocol 
    (foo [this] (str (foo (A.)) (foo (B.)))))  
+0

我認爲你的意思*耦合*。你通常希望擁有高*內聚*和低*耦合*。我現在無法測試,但我會先嚐試完全驗證'foo',例如'我的協議/ foo'。 – coredump

+0

內聚/耦合的好處。編輯。 –

回答

3
(ns type-a 
    (:require my-protocol :refer [MyProtocol]) 

你指的是協議,但從來沒有foo,所以磨片n你試圖撥打foo編譯器不知道你的意思。相反寫:

(ns type-a 
    (:require my-protocol :refer [MyProtocol foo]) 
+0

謝謝!從大多數教程中我不太清楚,在使用defprotocol和deftype之後,我已經看到了你的命名空間的外觀。你有鏈接到一個好的,我們可以添加爲後代的鏈接? –

相關問題