Sam*_*tep 10 inheritance clojure
在Clojure的类型机制的文档中,有人说
- 具体推导是坏事
- 你不能从具体类,只有接口派生数据类型
但是,一些核心Clojure类使用具体派生(还有其他示例,但这些是超类属于其中的唯一情况clojure.lang):
ARef 扩展 AReferenceAgent 扩展 ARefAtom 扩展 ARefNamespace 扩展 AReferenceRef 扩展 ARefVar 扩展 ARef另外,还有很多抽象类.但是,没有办法在Clojure中创建一个抽象类的等价物,对我来说,抽象类的扩展似乎具有与常规具体派生相同的缺点.
为什么在这里使用具体的推导?
在谈到哲学问题时,我觉得自己不够权威,但这是我的两点意见。
您引用的文本出现在那里的原因是警告滥用defrecord和deftype。Clojure 不鼓励将记录/类型公开为 API。相反,应该尽可能公开接口。毕竟,OO 语言公开类,而 FP 语言公开函数/方法/接口。
另一方面,您提到 clojure 的实现本身使用抽象类并继承它们。我宁愿将这些视为“某人必须做的肮脏工作”。JVM 的设计使其在 OO 世界中的原语上最高效。OO 世界虚拟机和 FP 世界语言之间的差距必须由某人来填补。