Chapter 9. Multimethods and Hierarchies
Runtime Polymorphism Without Classes
Clojure is not an object-oriented language in the traditional sense of classes and methods, although it is built on Java's object-oriented foundation.
Most mainstream object-oriented languages, such as Java and C++, use classes to define a tree-like hierarchy of types and to provide implementations of the methods supported by those types.
Clojure separates type hierarchies from method implementations, which greatly simplifies thorny issues such as multiple inheritance. In addition, it permits you to define multiple, independent hierarchies over the same types. This makes it possible to define IS-A relationships that more closely model the real world.
Clojure multimethods ...