由:wagjo
我认为我们不需要默认实现。为什么我们要扩展某些协议,实现它的方法,然后调用它们,期望它们不会抛出异常?您需要明确您的类型应该如何表现,无论是默认行为还是自定义行为。您基本有三个选择
`
(defn default-foo
[this]
:foo)
(defprotocol P
(-foo [this]))
(deftype T
P
(-foo [this] (default-foo))
(defn foo
[x]
(-foo x))
`
或者
`
(defprotocol P
(-foo [this]))
(deftype T)
(defn foo
[x]
(if (satisfies? P x)
(-foo x)
:foo))
`
或者
`
(defprotocol P
(-foo [this]))
(extend-protocol P
java.lang.Object
(-foo [this] :foo))
(deftype T)
(defn foo
[x]
(-foo x))
`
不过,我认为第一种方案不够优雅,应优先考虑后面的方案。