Протоколы и мультиметоды для полиморфизма
Clojure предлагает два гибких инструмента полиморфизма, дополняющих макросы и модульное проектирование. На этом уроке вы изучите протоколы и мультиметоды для расширяемого кода без жёстких связей.
«Протоколы и мультиметоды для полиморфизма» — бесплатный урок Clojure Functional Programming & JVM Backend Development на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Clojure Functional Programming & JVM Backend Development, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Clojure Functional Programming & JVM Backend Development содержит 4 уроков всего.
Части этого урока еще не переведены и отображаются на английском.
Polymorphism in Clojure
Clojure separates data from behavior. Protocols and multimethods let you dispatch behavior without classes or inheritance.
Defining a Protocol
A defprotocol names a set of method signatures, like an interface.
(defprotocol Shape
(area [s])
(perimeter [s]))Implementing With a Record
Use defrecord to create a type that implements the protocol.
(defrecord Circle [r]
Shape
(area [_] (* Math/PI r r))
(perimeter [_] (* 2 Math/PI r)))
(println (area (->Circle 2)))Dispatch on Type
Protocols dispatch on the type of the first argument. This is fast and the most common polymorphism in Clojure.
Extending Existing Types
Use extend-protocol to add behavior to types you do not own, even built-in ones.
(extend-protocol Shape
java.lang.Long
(area [n] (* n n)))
(println (area 5))When You Need More
Protocols only dispatch on type. When you must dispatch on a value, multiple arguments, or a computed key, reach for multimethods.
Defining a Multimethod
defmulti takes a dispatch function; defmethod supplies an implementation per dispatch value.
(defmulti describe :kind)
(defmethod describe :dog [_] "woof")
(defmethod describe :cat [_] "meow")
(println (describe {:kind :dog}))The Default Method
Provide a :default method to handle unmatched dispatch values gracefully.
(defmethod describe :default [_] "unknown")
(println (describe {:kind :fish}))Dispatch on Anything
The dispatch function can compute any value, even from multiple arguments, giving multimethods far more flexibility than protocols.
(defmulti combine (fn [a b] [(:type a) (:type b)]))
; dispatch on a pair of typesChoosing Between Them
Prefer protocols for type-based, performance-sensitive dispatch. Use multimethods when dispatch logic is richer than a single type.
Open for Extension
Both tools are open: new types or methods can be added later in separate namespaces without editing the original code, solving the expression problem cleanly.
Quick Check
Test your polymorphism knowledge.
Recap
You learned protocols with defrecord and extend-protocol for type dispatch, multimethods with defmulti/defmethod for value dispatch, default methods, and how both keep code open for extension.
Часто задаваемые вопросы
Урок «Протоколы и мультиметоды для полиморфизма» бесплатный?
Да — полный текст урока «Протоколы и мультиметоды для полиморфизма» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Clojure Functional Programming & JVM Backend Development, подпишись на CoddyKit PRO. Курс Clojure Functional Programming & JVM Backend Development содержит 4 уроков всего.
Чему я научусь в уроке «Протоколы и мультиметоды для полиморфизма»?
Clojure предлагает два гибких инструмента полиморфизма, дополняющих макросы и модульное проектирование. На этом уроке вы изучите протоколы и мультиметоды для расширяемого кода без жёстких связей. Ты практикуешь Clojure Functional Programming & JVM Backend Development с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Clojure Functional Programming & JVM Backend Development?
Предыдущий опыт не требуется. Clojure Functional Programming & JVM Backend Development на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Протоколы и мультиметоды для полиморфизма»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Clojure Functional Programming & JVM Backend Development?
Да. Каждый урок Clojure Functional Programming & JVM Backend Development включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Понимание макросов Clojure
- Определение и использование пространств имён
- Организация кода с помощью модулей
- Протоколы и мультиметоды для полиморфизма