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

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

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

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

1-20219-a129a7.png

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

2-20219-e8f2bc.png

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

3-20219-c1295e.png

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

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

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

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться
Популярное
Сегодня тут пусто