我正在学习Clojure,我想知道如何在Clojure中处理类似OO的子类。例如:一个主抽象类,两个抽象子类(每个都重新定义了一些函数),在第三层,最后的子类创建了"对象"将在函数中使用。不知道如何做到这一点。但是,我设法用一个抽象类来创建一个子类,使用defprotocol和defrecord。但我无法在另一个内部实施协议。感谢
答案 0 :(得分:6)
您不需要类或子类。将您的数据表示为具有属性的地图。 “子类”可能有更多属性。
如果你的函数在属性上有所不同,那么要么使用基于属性的条件逻辑(if,cond等),要么根据多方法或协议使用多态,如果你真的需要的话。
用黑客帝国的话说,没有勺子。
答案 1 :(得分:2)
您可以使用以下协议进行继承:
(extend <subtype>
<protocol>
(merge (get-in <protocol> [:impls <basetype>])
<map-of-redefined-methods>))
Multimethods使用derive
为继承提供直接支持。
可以使用:extends
关键字将实际Java子类关系指定为gen-class
。不过,这仅适用于Java互操作。
一般来说,值得检查一下你是否真的需要继承。它通常不是Clojure中首选的建模方法。