我正在尝试扩展库DomKM/silk。具体来说,有一个实现协议
这在Clojure/ClojureScript中该如何实现?
Pattern
的deftype Route
,它具有方法实现,我想在我的自定义实现Pattern
协议中重用这些方法实现。
https://github.com/DomKM/silk/blob/master/src/domkm/silk.cljx#L355
(deftype Route [name pattern]
Pattern
(-match [this -url]
(when-let [params (match pattern (url -url))]
(assoc params ::name name ::pattern pattern)))
(-unmatch [this params]
(->> (dissoc params ::name ::pattern)
(unmatch pattern)
url))
(-match-validator [_]
map?)
(-unmatch-validators [_]
{}))
我现在的实现看起来应该是这样的,但是我想要“继承”Route
的方法。我的意思是先执行一些自定义逻辑,然后再将它传递给原始的Route
方法。
(deftype MyRoute [name pattern]
silk/Pattern
(-match [this -url]
true) ;match logic here
(-unmatch [this {nm ::name :as params}]
true) ;unmatch logic here
(-match-validator [_] map?)
(-unmatch-validators [_] {}))
这在Clojure/ClojureScript中该如何实现?
Route
对象,并让MyRoute
的方法委托给Route
的方法。由deftype
创建的对象是Java类,因此您可能可以使用允许继承的两个Java互操作宏之一来实现您想要的功能:proxy
和gen-class
。gen-class
可能过于复杂,因此如果您选择这条路线,我建议使用proxy
。然而,这与Clojure的设计目标相违背,因此您可能希望简单地重新实现所需的代码。 - MarsRoute
中的函数并不是很大。如果您想要经常这样做,可以编写deftype
对象外部的函数,并使用Pattern
方法调用它们。 - Mars(proxy [Route] [name pattern] (-match []))
时,我遇到了一个错误java.lang.VerifyError: Cannot inherit from final class
。在deftype上使用代理是否可行? - ma2sdef-abstract-type
жқҘе®һзҺ°иҝҷдёҖзӮ№гҖӮ - ClojureMostly