欢迎!请参阅关于页面以获取更多关于如何使用此功能的信息。
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的impls调用同一个函数。另一种方法是利用协议的底层实现功能来外部提供处理过的扩展。
协议的一个重要优点是可以外部扩展,超出类型。协议实际上只是包含类型到函数impls映射的映射。您可以为拉取基impls、进行优化并添加到协议映射的方法定义一个优化宏。这可能有些复杂,我无法详细说明,但是是可能的。
您还可以使用多方法以及关键字层次结构支持作为另一种选择(但缺点是需要10个或更多多方法)。
也许你可以让“Q具有R”。在这种情况下,你的工作差不多完成了。
也许你需要分叉库来实现你需要的(或者更容易扩展)。
你可以在Datatypes页面上找到Clojure放弃实现继承的部分理由:[https://clojure.org/reference/datatypes#_datatypes_and_protocols_are_opinionated](https://clojure.org/reference/datatypes#_datatypes_and_protocols_are_opinionated)