将defmulti转换为defprotocol

时间:2015-05-15 06:05:25

标签: clojure

是否可以转换以下代码,以便使用<a href="whatsapp://send" data-text="Take a look at this awesome website:" data-href=" ( your url )">Share</a> defprotocol代替defrecorddefmulti

defmethod

1 个答案:

答案 0 :(得分:5)

是的,您在协议定义Shape中声明了您的函数,然后在各种记录实现SquareCircle等中定义您的实现。

(defprotocol Shape 
  (area [this])
  (perimeter [this]))

(defrecord Square [side] Shape
  (area [this] (* (:side this) (:side this)))
  (perimeter [this] (* 4 (:side this))))

(defrecord Rect [w l] Shape
  (area [this] (* (:l this) (:w this)))
  (perimeter [this] (+ (:l this) (:l this) (:w this) (:w this))))

(def s (->Square 4))
(def r (->Rect 2 5))

(map area [s r]) ; '(16 10)
(map :side [s r]) ; '(4 nil)
(map :l [s r]) ; '(nil 5)

如果你熟悉的话,基本上这就像OOP(但是不可改变的)。

对于像这样的事情的defmulti实现的一个好处是,你可以经常只是序列化和反序列化你的地图并按原样使用它们,而不必将它们统一到特定的记录类中。