欢迎!请查阅关于页面以了解该功能的工作原理。
lib.core/P
lib.core/R
my.core/Q
实现 Q 的选项有哪些?a) 复制粘贴 R 中的其他9个函数。b)还有什么其他选择?
是否值得实现某种"记录精炼"功能?
(defrecord Q [a b c] :refines lib.core/R lib.core/P (just-my-one-changed-fn [] ...))
我认为由于哲学上对具体派生的反对,将"精炼"视为增强的可能性非常高。
一个处理方法是在 R 和 Q 中调用相同的功能。另一个方法是使用协议的低级别实现功能来外部提供操作的扩展。
协议的一个大好处是它们可以被外部扩展,在类型之外。协议实际上只是包含类型到函数实现的映射的映射。您可以定义一个refine宏,它展开以拉取基本实现,使用精炼修改,并将这些方法添加到协议映射中。这对我来说有点过于复杂,但它是可能的。
您还可以使用多方法以及关键字层次结构支持作为另一个选项(缺点是需要10个或更多多方法)。
也许你可以这样使其变为 "Q 拥有 R"。在这种情况下,你的工作几乎已经完成了。
也许你需要分叉这个库来实现你所需要的功能(或更容易扩展)。
你可以在“数据类型”页面中找到关于 Clojure 排除实现继承的一些理由:https://clojure.org/reference/datatypes#_datatypes_and_protocols_are_opinionated