我有一个名为的协议IExample
,我定义了一个A
实现它的记录类型:
(defprotocol IExample
(foo [this] "do something")
(bar [this] "do something else"))
(defrecord A [field1 field2]
IExample
(foo [this]
(+ field1 field2))
(bar [this]
(- field1 field2)))
假设我想扩展另一种(基本)类型B
来实现这个协议,但我知道如何从 toB
转换A
:
(defn B-to-A
"converts a B object to an A object"
[Bobj] ...)
因为我有这个转换,我可以通过委派他们将所有协议调用IExample
委托B
给IExample
协议A
:
(extend B
IExample {
:foo (fn [this] (foo (B-to-A this)))
:bar (fn [this] (bar (B-to-A this)))})
然而,这似乎是大量不符合 clojure 习惯的样板文件(尤其是对于更大的协议)。
我如何告诉 clojure 只是隐式转换B
为A
每次IExample
在B
对象上调用函数时,使用该B-to-A
函数?