(Clojure的)多方法和(C#)扩展方法之间的区别?

时间:2011-08-21 17:52:25

标签: c# clojure

我刚刚观看了Clojure中的协议视频,并解释了“多方法”的工作原理。在我看来,它们看起来非常类似于C#中的扩展方法。它们基本上是一回事(除了您不需要在Clojure中创建静态类)或者是否存在根本区别?使用它们是否有优势或劣势?

2 个答案:

答案 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)

还取决于arg1arg2,...,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"