假设我有两个协议:
(defprotocol A
(f [this]))
(defprotocol B
(g [x y]))
我想将协议B扩展到支持协议A的所有实例中:
(extend-protocol A
String
(f [this] (.length this)))
(extend-protocol B
user.A
(g [x y] (* (f x) (f y))))
主要的动机是避免单独扩展B到A可能被扩展到的所有可能的类,甚至是其他人可能将A扩展到的未知未来类(例如,如果A是公共API的一部分)。
但是这样并不起作用-你会得到像下面这样的东西:
(g "abc" "abcd")
=> #<IllegalArgumentException java.lang.IllegalArgumentException:
No implementation of method: :g of protocol: #'user/B found for
class: java.lang.String>
这是否有可能呢?如果不行,是否有明智的解决方法来实现相同的目标?
map
来消除重复,例如(map #(extend % P common-P-impl) [R S T])
。 - KingCodedoseq
或包含doall
来处理地图的惰性。 - KingCode