是否可以在Clojure中进行数据类型继承?

时间:2011-12-12 02:34:20

标签: clojure functional-programming

例如,如果我有两个不同的记录,但它们共享少数几个公共字段,有没有办法让两个记录共享一个共同的基本记录?看起来协议只允许声明方法签名。

2 个答案:

答案 0 :(得分:4)

我认为现在不可能。

defrecord只是一个宏,您可以使用macroexpand查看其功能,例如:

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

因此,如果您想要这样的记录继承,您可能需要实现一个宏来执行此操作。 但我不建议继承是我试图避免的,因为它会导致复杂性。

答案 1 :(得分:4)

您应该针对抽象而不是特定字段进行编程,即使用协议以便记录可以共享公共接口。例如,如果所有记录类型都需要返回'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)))

如果您发现自己为特定协议方法创建了相同的实现,则可以始终“定义”(非公共函数)实现,并将其用作每种记录类型中的实现。