使用extend-protocol
,协议P
可以为实现接口I
的任何内容提供默认实现。这实质上教导I
做新事物。如果我们希望类型或记录提供I
的功能,我们仍需要使用I
扩展它们。
有没有办法根据I
的行为来指定P
行为(它的方法)?
我的协议P
(类似于流)有(seq [this] [this timeout-value])
来提供序列访问。第二个是在流过期时返回一个特殊值。 (结束序列会让人感到困惑。)
P
也有(close [this])
。
我希望扩展P
的对象可以在clojure.core/seq
中使用(作为Sequable
)并实现java.io.Closeable
。实现此目的的一种方法是从P
中删除这些方法,然后只执行Sequable
&类型/记录中的Closeable
。但是当有人递给我时P
无法确定它是否可以关闭或seq
。叫我面向对象,但是P extends I
。
如果P
seq
多个arity是个问题,seq
& seq'
也会这样做。