Могу ли я использовать производную Clojure для создания иерархии типов классов defrecord? - PullRequest
6 голосов
/ 03 января 2011

Я хотел бы сделать что-то вроде:

(defrecord Base [])
(defrecord Person [])
(defrecord Animal [])

(derive Person Base)
(derive Animal Base)

(isa? Animal Person)

Возможно ли это?

Обновление:

С тех пор я понял, что это невозможно, поэтому яя делаю что-то вроде этого:

(defmulti type class)
(defmethod type Base [_] ::base )
(defmethod type Animal [_] ::animal )
(defmethod type Person [_] ::person )

Имеет ли это смысл или есть лучший способ?

1 Ответ

9 голосов
/ 03 января 2011

Нет.Записи являются классами Java.Поскольку страница multimethods сообщает:

Вы также можете использовать класс в качестве дочернего (но не родительского, единственный способ сделать что-то дочерним для класса - через Javaнаследование).

Вы не можете расширять классы записями, но вы можете реализовать интерфейсы .Используя интерфейсы для игры в иерархии классов Java, вы можете заставить что-то работать.

...