というプロトコルがあり、それを実装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
このプロトコルを実装するために別の (基本的な) 型を拡張したいが、 から に変換する方法を知っているとしましょB
う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 の慣用句ではないようです。
関数を使用して、オブジェクトで関数が呼び出されるたびに暗黙的に変換B
するようにclojureに指示するにはどうすればよいですか?A
IExample
B
B-to-A