的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