2011-12-12 105 views
7

例如,如果我有两个不同的记录,但他们共享少数常用字段,是否有办法让两个记录共享一个共同的基本记录?看来协议只允许声明方法签名。是否可以在Clojure中进行数据类型继承?

+0

这两个实体共享一些字段并不是真正足够的理由来创建它们之间的继承关系。也许提供一些示例使用场景。 –

+1

例如,我正在使用记录来表示已分析的SQL查询。所以我有SELECT,UPDATE,INSERT等等的记录。它们共享一些常见的属性,比如'string'属性。当我使用多态函数处理它们时,我想确保它们都有一些共同的属性。 – Chris

+1

记录只是奇特的地图,所以我不清楚“确保它们都具有一些共同的属性”意味着什么。你为什么不能直接调用'(:string a-record)'?另外,记录可能具有的一组键与具体类型可以表达的行为是不同的问题。你试图解决什么是实际问题? –

回答

3

我不认为这是可能的,因为现在。

defrecord只是一个宏,您可以通过使用macroexpand,像检查它做什么:

(macroexpand '(defrecord User [Name Age])) 

所以,如果你想你可能需要实现一个宏这样做,这样的纪录继承。 但我不会认为继承是我试图避免的,因为它会导致复杂性。

3

您应该针对抽象进行编程,而不是特定的字段,即使用协议,以便记录可以共享通用接口。例如,如果所有的记录类型都需要返回'string'属性,那么使用'get-string'方法创建一个协议并将其扩展到每个记录类型。

(defprotocol SQL 
    (get-string [t])) 

(defrecord Thing [name f1 f2] 
    SQL 
    (get-string [t] (str name))) 

(defrecord AnotherThing [name f1 f2 f3 f4 blah] 
    SQL 
    (get-string [t] (str name))) 

如果你发现自己创造了一个特定的协议方法,你可以随时“defn-”(非公功能)执行相同的实现,并以此作为每个记录类型的实现。

+1

如果我想创建一个共享另一条记录的某些字段的记录,该怎么办?像:(defrecord a [ba bc])(defrecord b [ba bc bd] ..如何处理这种情况? –