Ige*_*ger 17 polymorphism case clojure switch-statement multimethod
我花了一些时间,试图理解Clojure多方法.据我所知,主要的"亲"多方法论证是他们的灵活性,然而,我对为什么多方法比简单的if或case语句更好的论证感到困惑.请有人解释一下,多态性与过度的案例陈述之间的界限在哪里?
编辑:我应该更清楚这个问题,我对'if'语句比较感兴趣.非常感谢您的回答!
iva*_*ant 25
假设我们有类型A,B,C,D和E,并且方法m1,m2,m3采用先前类型的单个参数.你可以把它们放在这样的表中:
| A | B | C | D | E |
m1 | | | | | |
m2 | | | | | |
m3 | | | | | |
Run Code Online (Sandbox Code Playgroud)
"switch"语句策略一次实现此表的一行.假设您添加了一个新类型F.您必须修改所有实现以支持它.
基于类的多态(C++,Java等)允许您实现整列.因此,添加新类型很容易,因为您不必更改已定义的类.但添加新方法很难,因为您必须将其添加到所有其他类型.
多方法允许您彼此独立地实现表格的单个单元格.
如果您必须分派多个参数,这种灵活性会更大.每个新参数都为此表添加了另一个维度,基于swich和基于类的调度都非常快速地变得非常复杂(参见访问者模式).
注意,多方法实际上甚至比描述更通用,因为你可以派遣几乎任何东西,而不仅仅是参数的类型.
sep*_*p2k 18
multimethods和一个大if语句之间的区别在于你需要修改包含case语句的函数来将case添加到if语句中.您可以添加新方法,而无需触及以前存在的方法.
因此,如果您在库中定义了一个多方法,并且希望用户能够为自己的数据类型扩展它,那就没问题了.如果您使用了if语句,那将是一个很大的问题.
| 归档时间: |
|
| 查看次数: |
1374 次 |
| 最近记录: |