2010-09-10 18 views

Odpowiedz

2

Mają takie same nazwy i pojęcia są ze sobą powiązane - jednak protokoły Clojure a bardziej ogólne i mają na celu rozwiązanie "problemu z ekspresją". To video is very interesting to watch.

Protokoły Objective C to bardziej jak interfejsy Java/C# - określają zestaw metod, które może zaimplementować konkretna klasa. Jednak musisz podać te metody w konkretnej klasie, co zwykle oznacza w praktyce, że kontrolujesz kod źródłowy dla rozszerzanej klasy.

protokoły Clojure pozwalają zdefiniować zestaw funkcji, które rozciągają obsłużyć dowolnej klasy w polimorficzny mody, można dostarczyć implementacje oddzielnie, nawet jeśli nie kontrolują klasę jesteś rozciągające.

Przykładem rozszerzenie protokołu Clojure do klasy java.lang.String na przykład (co na pewno nie kontroluje!), A także do zera szczególnej wartości (czyli wartość null):

;; 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" 
Powiązane problemy