例如,如果我有两个不同的记录,但他们共享少数常用字段,是否有办法让两个记录共享一个共同的基本记录?看来协议只允许声明方法签名。是否可以在Clojure中进行数据类型继承?
7
A
回答
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] ..如何处理这种情况? –
相关问题
- 1. 匿名类型是否可以继承另一种类型?
- 2. Mosync:Widget是否可以继承TimerListener类
- 3. 是否可以根据组件类型和/或继承类型测试对象?
- 4. 是否可以继承XAML?
- 5. 是否可以继承System.Net.Mail.Mailmessage?
- 6. 是否可以继承MKPolyline
- 7. 函数是否可以继承参数?
- 8. 数据合同类是否可以相互继承?
- 9. 二进制树,其中数据是不同的继承类型
- 10. 从数据类型继承
- 11. 是否可以使用匿名类型进行数据绑定?
- 12. 每个数据类型是否都继承自Object?
- 13. 类可以从“参数”类继承吗? (有条件继承)
- 14. 是否可以继承Luigi任务?
- 15. 是否可以继承COM对象?
- 16. 是否可以将UITableView继承到SKNode?
- 17. 是否可以继承UiApplicationDelegate协议?
- 18. 是否可以从SPWeb继承?
- 19. 是否可以从ODOO中的扩展类继承?
- 20. 继承是否可以影响子类中的方法?
- 21. 在WCF中,数据约定类可以相互继承吗?
- 22. Web服务类是否可以继承asp.net页面类
- 23. Funcs是否可以继承以改变单个函数中的行为?
- 24. 通过子类型参数从类接口继承方法:是否有可能?
- 25. 是RCT_EXPORT_VIEW_PROPERTY可以继承
- 26. 检查对象类型是否继承抽象类型
- 27. 如何知道类型是否继承了其他类型?
- 28. 我可以从泛型类继承而不指定类型吗?
- 29. 可以继承元素的类型变化在基类
- 30. HTML是否可以设置第二个类继承主ID?
这两个实体共享一些字段并不是真正足够的理由来创建它们之间的继承关系。也许提供一些示例使用场景。 –
例如,我正在使用记录来表示已分析的SQL查询。所以我有SELECT,UPDATE,INSERT等等的记录。它们共享一些常见的属性,比如'string'属性。当我使用多态函数处理它们时,我想确保它们都有一些共同的属性。 – Chris
记录只是奇特的地图,所以我不清楚“确保它们都具有一些共同的属性”意味着什么。你为什么不能直接调用'(:string a-record)'?另外,记录可能具有的一组键与具体类型可以表达的行为是不同的问题。你试图解决什么是实际问题? –