Описание тега clojure-protocol
Протоколы были введены в Clojure 1.2
Протоколы были введены в Clojure 1.2.
Clojure написан в терминах абстракций. Существуют абстракции для последовательностей, коллекций, возможности вызова и т. Д. Кроме того, Clojure предоставляет множество реализаций этих абстракций. Абстракции определяются интерфейсами хоста, а реализации - классами хоста. Хотя этого было достаточно для начальной загрузки языка, он оставил Clojure без аналогичной абстракции и средств реализации низкого уровня. Функции протоколов и типов данных добавляют мощные и гибкие механизмы для абстрагирования и определения структуры данных без каких-либо компромиссов по сравнению с возможностями платформы хоста.
Есть несколько мотивов для протоколов:
- Обеспечить высокопроизводительную динамическую конструкцию полиморфизма в качестве альтернативы интерфейсам
- Поддержка лучших частей интерфейсов
° спецификация, только реализация
° один тип может реализовать несколько протоколов - Избегая некоторых недостатков
° Какие интерфейсы реализованы - это выбор автора типа во время разработки, который не может быть расширен позже (хотя внедрение интерфейса может в конечном итоге решить эту проблему)
° реализация интерфейса создает отношения и иерархию типа isa/instanceof - Избегайте "проблемы выражений", позволяя независимым расширениям набора типов, протоколов и реализации протоколов для типов различными сторонами
° сделать это без упаковщиков / адаптеров - Поддержка 90% случаев мультиметодов (одна отправка по типу) при обеспечении абстракции / организации более высокого уровня
Ссылка: http://clojure.org/protocols