我刚刚看了一个关于Clojure协议的视频,它解释了“多方法”是如何工作的。在我看来,它们看起来非常类似于C#中扩展方法的工作原理。它们是基本上相同的东西(除了您不需要在Clojure中创建静态类),还是有根本的区别?使用这两种方法有优势还是劣势?
发布于 2011-08-22 01:59:31
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的运行时类型。
您可以使用achieve在C#中使用dynamic实现类似的功能。
坦率地说,它与扩展方法一点关系都没有。
发布于 2011-08-22 22:56:30
Clojure multimethod是为完全动态分派而设计的--也就是说,您可以基于的任意函数而不是参数来选择函数的实现。
在计算的属性上进行调度的示例:
(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"https://stackoverflow.com/questions/7140000
复制相似问题