的Clojure允許deftype
s表示不完全實現一個接口,如未完全執行的Clojure中接口
(deftype Foo [x] clojure.lang.ISeq (next [this] x))
(Foo
沒有實現seq
)。來自Pythonic的duck-typing,或者至多(或者最糟糕的,取決於你的POV),ABCs,我很難理解爲什麼允許這樣的不完整的實現,因爲我認爲接口的重點是保證一套方法(就像現在一樣,似乎要安全地使用其他人的deftype
s,我必須在try...catch
中包裝每個「方法」調用)。
當然,需要一個完整的實現使得交互式編程變得更加困難,但是如果你實際上沒有實現ISeq,你怎麼聲稱你實現了ISeq?我的意思是,如果你被允許不完全實現一個接口,那麼我也可以聲稱我的代碼片段實現了所有現有的接口(它恰好每隔一段時間就會引發AbstractMethodError)。 – antony
@atony,我一直在寫Clojure 4年。這在實踐中不是問題。 – dnolen
我想這意味着協議應該被認爲是一種元數據形式,並且只有協議功能是「真實的」? – antony