2016-11-20 57 views
1

我学习Clojure的,我想知道如何处理用Clojure OO类的子类。例如:一个主抽象类,两个抽象子类(每个都重新定义了一些函数),在第三级中创建将在函数中使用的“对象”的最终子类。不知道如何做到这一点。但是,我设法用一个抽象类来完成一个子类,并使用defprotocol和defrecord。但是我不能在另一个内部实现一个协议。由于子类Clojure中

+1

创建一个协议作为一个抽象基类,然后定义表示每个新的“层次”的协议。记录可以实现多个协议,所以这应该起作用。 – Carcigenicate

+0

也许是相关的:http://clojure.org/reference/multimethods(尤其是Clojure避开传统OO方法的部分,但你可以通过不同的方式实现多态)。 –

+0

@Carcigenicate的事情是,我需要记录来实现一个协议,这将带来它的基础协议。例如:我有7类的顺序: A-> B A->Ç 乙 - > d B->电子 C->˚F C-“G 而对于B和C,他们需要重新定义A – juanimoli

回答

6

你不需要类或子类。将您的数据表示为具有属性的地图。 “子类”可能有更多的属性。

如果您有关于属性变化的函数,则既可以使用基于属性的条件逻辑(如果,标准条件等),或者使用基于多方法或协议多态性,如果你真的需要。

在矩阵的话,没有勺子。

+0

我真的需要研究多种方法中的一种。我一直在写Clojure近半年,现在还没有碰到它们。 – Carcigenicate

2

你可以继承像这样的协议:

(extend <subtype> 
    <protocol> 
    (merge (get-in <protocol> [:impls <basetype>]) 
     <map-of-redefined-methods>)) 

多方法提供与derive继承的直接支持。

实际的Java子类关系可以用:extends关键字指定为gen-class。不过,这仅仅意味着Java互操作。

一般情况下,它是值得一试,你是否真的需要继承。它通常不是Clojure中建模的首选方法。