Clojure中的多态性

mik*_*era 2 oop polymorphism clojure object data-structures

假设我有一堆Clojure数据结构,所有类型都相同 - 例如defrecord定义的对象类型.

在这些结构中获得多态行为的最佳方法是什么?

在结构中嵌入一个函数以便我可以执行以下操作是一种好习惯:

((:my-method my-object) param1 param2)
Run Code Online (Sandbox Code Playgroud)

或者,还有更好的方法?

Ham*_*aya 5

你可以使用multimethods进行调度,

(derive ::subtype ::type)
Run Code Online (Sandbox Code Playgroud)

然后你可以根据类型进行调度

(defmulti my-method
  (fn [type] ((meta type) :type)))

(defmethod my-method ::subtype []
  ;;stuff...
 )
Run Code Online (Sandbox Code Playgroud)

您需要在创建对象元数据时添加:type,

(with-meta [1 2 3] {:type ::subtype})
Run Code Online (Sandbox Code Playgroud)

或者我没有尝试过这个,但是因为协议和记录会在你根据该名称发送的幕后创建java类.