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方法是什么?)
协议就像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)
| 归档时间: |
|
| 查看次数: |
711 次 |
| 最近记录: |