mik*_*era 2 oop polymorphism clojure object data-structures
假设我有一堆Clojure数据结构,所有类型都相同 - 例如defrecord定义的对象类型.
在这些结构中获得多态行为的最佳方法是什么?
在结构中嵌入一个函数以便我可以执行以下操作是一种好习惯:
((:my-method my-object) param1 param2)
Run Code Online (Sandbox Code Playgroud)
或者,还有更好的方法?
你可以使用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类.