Clojure,方面,defprotocol,defrecord

3 clojure

(defprotocol IAnimal "IAnimal"
  (report [o]
    (println (type o) " reporting.\n")
    (inner-report o)
    (println (type o) " out.\n")))

(defrecord Dog [] IAnimal
  (inner-report [o]
    (println "Woof Woof.\n")))

(defrecord Cat [] IAnimal
  (inner-report [o]
    (println "Meow Meow.\n")))

(defrecord Vampire [] IAnimal
  (inner-report [o]
    (println "I don't sparkle.\n")))
Run Code Online (Sandbox Code Playgroud)

现在,我希望它输出:

Dog reporting.
Woof Woof.
Dog out.
Cat reporting.
Meow Meow.
Cat out.
Vampire reporting.
I don't sparkle.
Vampire out.
Run Code Online (Sandbox Code Playgroud)

不幸的是,由于上述代码未编译,因此不会发生这种情况。实现“这个”的最佳方法是什么?

我所说的“此”是指我想成为某个协议的一部分的功能,我想为所有记录提供一个实现,并且我希望该功能可以访问记录实现的专用功能。

(这样做的Clojure方法是什么?)

Jea*_*ano 5

协议就像Java接口一样,它们无法为其方法提供实现。但这有效:

(defn report [o]
  (println (type o) " reporting.\n")
  (inner-report o)
  (println (type o) " out.\n"))

(defprotocol IAnimal
  "the animal protocol"
  (inner-report [o] "a report"))

(defrecord Dog []
  IAnimal
  (inner-report [o]
    (println "Woof Woof.\n")))

(defrecord Cat []
  IAnimal
  (inner-report [o]
    (println "Meow Meow.\n")))

(defrecord Vampire []
  IAnimal
  (inner-report [o]
    (println "I don't sparkle.\n")))

(report (new Cat))
;; user.Cat reporting.
;; Meow Meow.
;; user.Cat out.
Run Code Online (Sandbox Code Playgroud)