2012-05-22 62 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