首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Clojure、Aspects、Defprotocol、Defrecord

Clojure、Aspects、Defprotocol、Defrecord
EN

Stack Overflow用户
提问于 2012-11-18 12:47:35
回答 1查看 725关注 0票数 3
代码语言:javascript
复制
(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")))

现在,我想让它输出:

代码语言:javascript
复制
Dog reporting.
Woof Woof.
Dog out.
Cat reporting.
Meow Meow.
Cat out.
Vampire reporting.
I don't sparkle.
Vampire out.

不幸的是,这不会发生,因为上面的代码不能编译。实现“这”的最好方法是什么?

这里的" this ",我的意思是我有一些函数,我想成为协议的一部分,我想对所有记录都有一个实现,我想让这个函数能够访问记录实现的特定函数。

(做这件事的clojure方法是什么?)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-18 16:46:13

协议就像Java接口,它们不能为它们的方法提供实现。但这是可行的:

代码语言:javascript
复制
(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.
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13437586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档