В книге «Радость Clojure» defprotocol
предлагается в качестве решения проблемы выражения - «желание реализовать существующий набор абстрактных методов для существующего конкретного класса безнеобходимо изменить код, который определяет либо. "
Приведенный пример выглядит следующим образом:
(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, но как это сделать?отличается от следующего?
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;
}
}
В конце концов, оба используются одинаково:
(cat "House" " of Leaves")
Util.cat("House", " of Leaves");
Функция Clojure cat
это не a метод для классов String
и List
, а скорее независимая функция , перегруженная для приема аргументов String
или List
.
Хотя мне действительно нравитсяClojure, я не понимаю претензий превосходства для этой конструкции.