Полиморфизм в Clojure. Протоколы

Чтобы создать полиморфные функции, в языке программирования Clojure предусмотрено два механизма. Поначалу язык поддерживал лишь мультиметоды — безусловно, средство мощное, однако на практике часто избыточное. Но уже начиная с версии 1.2, была добавлена новая концепция — протоколы. О них и поговорим.

Протоколы напоминают Java-интерфейсы, однако они не способны друг друга наследовать. При этом в каждом протоколе описывается набор функций.

Таким образом мы объявляем 2 сущности — сам протокол, плюс функцию show -- обычную Clojure-функцию, которая при вызове подыскивает самую подходящую реализацию на основании типа 1-го аргумента. При этом важно отметить, что отдельно объявляются необходимые структуры данных и указывается реализация протокола для них.

На практике есть возможность реализации протокола для стороннего типа (включая встроенный).

Также есть возможность добавить реализацию протоколов к уже имеющимся типам, причем даже в том случае, если отсутствует доступ к исходным кодам. И не стоит думать, что тут происходит некая магия манипуляций с байткодом и другие подобные фокусы. Язык Clojure создает глобальную таблицу тип -> функция реализации, а при вызове метода протокола осуществляется поиск в этой таблице по типу 1-го аргумента с учетом иерархии. В результате декларация новой реализации для протокола будет сведена к обновлению глобальной таблицы.

Хотите знать больше? Добро пожаловать на специализированный курс "Closure Developer" в Otus!

По материалам https://habr.com/ru/post/173071/.