首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(Clojure的) multimethod和(C#的)扩展方法之间的区别?

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

Stack Overflow用户
提问于 2011-08-22 01:52:25
回答 2查看 740关注 0票数 9

我刚刚看了一个关于Clojure协议的视频,它解释了“多方法”是如何工作的。在我看来,它们看起来非常类似于C#中扩展方法的工作原理。它们是基本上相同的东西(除了您不需要在Clojure中创建静态类),还是有根本的区别?使用这两种方法有优势还是劣势?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-22 01:59:31

Clojure中的mutlimethod特性适用于多个分派场景。它有效地支持运行时多态性,其中调用的方法取决于方法的参数的类型(传统的单分派多态性取决于接收方法调用的对象的运行时类型)。基本上,您可以将单分派多态性视为一种方法M

代码语言:javascript
复制
M(arg1, arg2, arg3, ..., argn)

调用的实际方法取决于arg1的运行时类型(因此我们重写了

代码语言:javascript
复制
arg1.M(arg2, arg3, ..., argn)

作为

代码语言:javascript
复制
M(arg1, arg2, arg3, ..., argn)

为了让这个比喻更清晰。在多重调度中,由调用的方法

代码语言:javascript
复制
M(arg1, arg2, arg3, ..., argn)

还取决于arg1arg2、...、argn的运行时类型。

您可以使用achieve在C#中使用dynamic实现类似的功能。

坦率地说,它与扩展方法一点关系都没有。

票数 9
EN

Stack Overflow用户

发布于 2011-08-22 22:56:30

Clojure multimethod是为完全动态分派而设计的--也就是说,您可以基于的任意函数而不是参数来选择函数的实现。

在计算的属性上进行调度的示例:

代码语言:javascript
复制
(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"
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7140000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档