我刚刚观看了Clojure中的协议视频,并解释了“多方法”的工作原理。在我看来,它们看起来非常类似于C#中的扩展方法。它们基本上是一回事(除了您不需要在Clojure中创建静态类)或者是否存在根本区别?使用它们是否有优势或劣势?
答案 0 :(得分:9)
Clojure中的mutlimethod功能适用于多个调度方案。它有效地启用了运行时多态,其中调用的方法取决于方法的参数的类型(传统的单调度多态性取决于接收方法调用的对象的运行时类型)。基本上,您可以将单调度多态性视为方法M
M(arg1, arg2, arg3, ..., argn)
并且调用的实际方法取决于arg1
的运行时类型(所以我们重写了
arg1.M(arg2, arg3, ..., argn)
作为
M(arg1, arg2, arg3, ..., argn)
使类比清楚。在多分派中,由
调用的方法M(arg1, arg2, arg3, ..., argn)
还取决于arg1
,arg2
,...,argn
的运行时类型。
您可以使用dynamic
在C#中使用achieve类似的功能。
坦率地说,它根本与扩展方法无关。
答案 1 :(得分:3)
Clojure多方法专为完全动态调度而设计 - 即您可以根据参数上的任意函数选择函数的实现。
调度计算属性的示例:
(def stone {:name "stone" :weight 1000})
(def feather {:name "feather" :weight 1})
;; dispatch function - can be any function
(defn heaviness [thing]
(if (> (:weight thing) 100)
"Heavy"
"Not heavy"))
;; multimethod definition using the given dispatch function
(defmulti lift heaviness)
;; implementation of two alternative methods based
(defmethod lift "Heavy"
(fn [thing]
(str "Trying to lift a heavy " (:name thing))))
(defmethod lift "Not heavy"
(fn [thing]
(str "Easily lifting a light " (:name thing))))
(lift stone)
=> "Trying to lift a heavy stone"
(lift feather)
=> "Easily lifting a light feather"