2012-05-22 71 views
2

的Clojure允許deftype s表示不完全實現一個接口,如未完全執行的Clojure中接口

(deftype Foo [x] clojure.lang.ISeq (next [this] x)) 

Foo沒有實現seq)。來自Pythonic的duck-typing,或者至多(或者最糟糕的,取決於你的POV),ABCs,我很難理解爲什麼允許這樣的不完整的實現,因爲我認爲接口的重點是保證一套方法(就像現在一樣,似乎要安全地使用其他人的deftype s,我必須在try...catch中包裝每個「方法」調用)。

回答

1

這是Clojure動態語言哲學和Java靜態語言哲學之間的交集之一。而且它確實表明了兩者之間的混淆,我同意。原理是允許clojure程序使用Java庫而沒有任何不必要的痛苦,許多庫要求你通過傳遞一些實現方法的類的實例,以避免Java缺乏頭等功能。從這個角度來看,這種權衡是有道理的,但從其他角度來看,它並不適合Java哲學。

1

要求完整的實現會失敗交互式編程。如果某人爲您提供了一個沒有完全實現ISeq的類型,那麼他們給了您一個破碎的類型。也就是說,一個Clojure linter /分析器,檢查你的源實施疏忽聽起來很有用。

+0

當然,需要一個完整的實現使得交互式編程變得更加困難,但是如果你實際上沒有實現ISeq,你怎麼聲稱你實現了ISeq?我的意思是,如果你被允許不完全實現一個接口,那麼我也可以聲稱我的代碼片段實現了所有現有的接口(它恰好每隔一段時間就會引發AbstractMethodError)。 – antony

+0

@atony,我一直在寫Clojure 4年。這在實踐中不是問題。 – dnolen

+0

我想這意味着協議應該被認爲是一種元數據形式,並且只有協議功能是「真實的」? – antony