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

是否可以在Clojure中执行数据类型继承?,clojure,functional-programming,Clojure,Functional Programming,例如,如果我有两个不同的记录,但它们共享几个公共字段,有没有办法使两个记录共享一个公共基记录?协议似乎只允许声明方法签名 我认为目前还不可能 defrecord只是一个宏,您可以使用macroexpand检查它的功能,类似于: (macroexpand '(defrecord User [Name Age])) 因此,如果您想要这样的记录继承,您可能需要实现一个宏来实现。 但是我不会建议我尽量避免继承,因为它会导致复杂性。您应该针对抽象而不是特定字段进行编程,即使用协议以便记录可以共享一个公共

例如,如果我有两个不同的记录,但它们共享几个公共字段,有没有办法使两个记录共享一个公共基记录?协议似乎只允许声明方法签名

我认为目前还不可能

defrecord
只是一个宏,您可以使用
macroexpand
检查它的功能,类似于:

(macroexpand '(defrecord User [Name Age]))
因此,如果您想要这样的记录继承,您可能需要实现一个宏来实现。
但是我不会建议我尽量避免继承,因为它会导致复杂性。

您应该针对抽象而不是特定字段进行编程,即使用协议以便记录可以共享一个公共接口。例如,如果所有记录类型都需要返回“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-”(非公共函数)该实现,并将其用作每个记录类型中的实现

两个实体共享某些字段并不是在它们之间创建继承关系的充分理由。也许可以提供一些示例使用场景。例如,我使用记录来表示已解析的SQL查询。所以我有选择、更新、插入等记录。。它们共享一些公共属性,例如“字符串”属性。当我使用多态函数处理它们时,我想确保它们都有一些共同的属性。记录只是花哨的映射,所以我不清楚“确保它们都有一些共同的属性”是什么意思。为什么不能直接调用
(:string a-record)
?此外,记录可能具有的键集与具体类型可以表达的行为是不同的问题。您试图解决的实际问题是什么?如果我想创建一个共享另一个记录的某些字段的记录,该怎么办?比如:(defrecord a[ba bc])(defrecord b[ba bc bd]……如何处理此类案件?