"Clojure Joy" adlı kitapta,ifade sorunu için bir çözüm olarak sunulur - "varolan bir varolan soyut yöntemler kümesini uygulama isteği Ya da tanımlayan kodu değiştirmek zorunda kalmadan beton sınıfı. " aşağıdaki gibi verilenİfade sorununa çözüm olarak Clojure defprotocol
örnektir:
(defprotocol Concatenatable
(cat [this other]))
(extend-type String
Concatenatable
(cat [this other]
(.concat this other)))
(cat "House" " of Leaves")
;=> "House of Leaves"
(extend-type java.util.List
Concatenatable
(cat [this other]
(concat this other)))
(cat [1 2 3] [4 5 6])
;=> (1 2 3 4 5 6)
Java gibi bir dilde mümkün olmadığını ileri sürülmektedir, ama nasıl aşağıdaki farklıdır?
public class Util {
public static String cat(final String first,
final String second) {
return first.concat(second);
}
public static <T> List<T> cat(final List<T> first,
final List<T> second) {
final List<T> list = new List<T>(first);
list.addAll(second);
return list;
}
}
Sonuçta, iki benzer şekilde kullanılır:
(cat "House" " of Leaves")
Util.cat("House", " of Leaves");
Clojure fonksiyonu cat
String
ve List
sınıfları yöntemolmayan bir olmakla birlikte, bağımsız bir fonksiyonu ziyade bu ya String
veya List
argümanları kabul etmek aşırı yüklendi.
Gerçekten Clojure gibi, bu yapı için üstünlük iddiaları anlamıyorum rağmen.
Her ikisi de benzer şekilde çalışır. Fark (amalloy tarafından vurgulanan) Clojure durumda katılımcıların seti Concatenatable' 'kullanıcıları tarafından tanımlanır oysa Java durumda katılımcıların seti, Util'' yazarı tarafından tanımlanır olmasıdır. – fogus