2024 Clojure 状态调查中分享您的想法!

欢迎!请参阅关于页面以了解该系统的工作原理的更多信息。

0
Clojure

请看这个示例

`
(defprotocol Foo (foo [x] x))
Foo
(defrecord Bar [gaz waka] Foo)
user.Bar
(def bar (Bar. 1 2))

'user/bar

(.foo bar)

AbstractMethodError user.Bar.foo()Ljava/lang/Object; sun.reflect.NativeMethodAccessorImpl.invoke0 (NativeMethodAccessorImpl.java:-2)

`

关于默认实现怎么办?

4 个回答

0
0

评论者: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))
`

然而,我认为我的第一个方法不够规范,建议您使用后两种方法。

0

评论者:mobiusinversion

我同意,这是个低优先级的功能增强。我认为这能让协议体验更加简便,Java 8已经为接口提供了默认实现以实现同等便利。

0
参考: https://clojure.atlassian.net/browse/CLJ-1563 (由 alex+import 报告)
...