我一直在这里阅读“ Clojure基本原理”:
http://clojure.org/rationale
在“多态”部分中,其内容为:
Clojure multimethods decouple polymorphism from OO and types
Supports multiple taxonomies
Dispatches via static, dynamic or external properties, metadata, etc
这里的“支持多种分类法”是什么意思?我实际上在这种情况下是什么分类法?谢谢
最佳答案
user> (defmulti shade :color)
nil
user> (defmethod shade :black [_] "darkest of darks")
#<MultiFn clojure.lang.MultiFn@22b90f93>
user> (defmethod shade :white [_] "all frequencies are reflected")
#<MultiFn clojure.lang.MultiFn@22b90f93>
user> (defmulti movement :legs)
#'user/movement
user> (defmethod movement 2 [_] "walks on hind legs")
#<MultiFn clojure.lang.MultiFn@13b58075>
user> (defmethod movement 4 [_] "proceeds on all fours")
#<MultiFn clojure.lang.MultiFn@13b58075>
user> ((juxt movement shade) {:name "cat" :legs 4 :color :black})
["proceeds on all fours" "darkest of darks"]
在上面的代码中,创建了两个组织系统-一个在颜色方面,另一个在腿方面。这两种分类法都是同等有效的,并且根据所使用的分类法,同一对象可以落在不同的位置。
多方法还可以将层次结构用于调度(请参见
derive
和相关功能),其中每个层次结构可以并行共存(与类层次结构的统一视图不同)。user> (derive ::manx ::cat)
nil
user> (defmulti favorite-treat :species)
#'user/favorite-treat
user> (defmethod favorite-treat ::cat [_] "Tuna")
#<MultiFn clojure.lang.MultiFn@264d27e6>
user> (derive ::indoor ::domestic)
nil
user> (defmulti activity :tameness)
#'user/activity
user> (defmethod activity ::domestic [_] "window watching")
#<MultiFn clojure.lang.MultiFn@1654bf3f>
user> ((juxt favorite-treat activity) {:species ::manx :tameness ::indoor})
["Tuna" "window watching"]
在这里,同一只猫是两个层次结构的成员-一个是驯化的,另一个是遗传学的,可以适当地采用其中的一种方法来解决。
同样,即使设置asid多重方法,通过
derive
创建的关系也支持多重继承,这与jvm类继承层次Clojure建立在以下方面不同:user> (derive ::foo ::bar)
nil
user> (derive ::foo ::baz)
nil
user> (derive ::quux ::foo)
nil
user> (isa? ::quux ::foo)
true
user> (isa? ::quux ::bar)
true
user> (isa? ::quux ::baz)
true
user> (isa? ::bar ::baz)
false