2010-09-10 67 views

回答

2

他们共享相同的名称和概念是相关的 - 但是Clojure协议a更通用,旨在解决“表达问题”。这video is very interesting to watch。目标C协议是更类似于Java/C#接口 - 它们指定了具体类可以实现的一组方法。但是,您必须在具体类中提供这些方法,这通常意味着您在实践中控制了正在扩展的类的源代码。

Clojure的协议允许你定义一组延伸到处理在一个多态方式任何类的功能,并且可以单独地提供的实现即使不控制要扩展的类。

一个Clojure的协议延伸到例如java.lang.String类(你肯定不控制!),还为特殊值为零(即空值)的例子:

;; define a protocol with one function 
(defprotocol FooProtocol 
    (foo [this])) 

;; extend the protocol to String and nil 
(extend-protocol FooProtocol 
    java.lang.String 
    (foo [some-string] (str "Called foo on String: " some-string)) 
    nil 
    (foo [_] "Called foo on nil value")) 

(foo "hello") 
=> "Called foo on String: hello" 

(foo nil) 
=> "Called foo on nil value"