Clojureでは、いくつかのメソッドにデフォルトの実装があり、いくつかのメソッドにカスタムの実装があるプロトコルが必要です。そして、最初のものは構成のために後者のものを参照します。次に例を示します。
(defprotocol Saving
(save [this] "saves to mongodb")
(collection-name [this] "must return a string representing the associated MongoDB collection"))
;Default implementation
(extend-type Object
Saving
; the `save` method is common for all, so it is actually implemened here
(save [this] (mc/insert (collection-name [this]) this))
; this method is custom to every other type
(collection-name [this] "no_collection"))
;Particular implementations
(defrecord User
[login password]
Saving
(collection-name [this] "users"))
(defrecord NewsItem
[text date]
Saving
(collection-name [this] "news_items"))
ただし、このようには機能しません。またはインスタンスを呼び出すcollection-name
と正しいコレクション文字列が返されますが、それらを呼び出すと。が発生します。Clojureを使用して、この些細なOO型の目標をどのように達成できますか?User
NewsItem
save
AbstractMethodError