3
(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")))

今、私はそれを出力したいと思います:

Dog reporting.
Woof Woof.
Dog out.
Cat reporting.
Meow Meow.
Cat out.
Vampire reporting.
I don't sparkle.
Vampire out.

残念ながら、上記のコードはコンパイルされないため、これは発生しません。「これ」を達成するための最良の方法は何ですか?

「これ」とは、プロトコルの一部にしたい関数があり、すべてのレコードに対して1つの実装が必要であり、この関数がレコードが実装する特殊な関数にアクセスできるようにすることを意味します。

(これを行うためのclojureの方法は何ですか?)

4

1 に答える 1

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.
于 2012-11-18T08:46:12.933 に答える