怎么是“ isa”?基于多方法的语法多于instanceof?

我以clojure site为例。

(defmulti foo class)
(defmethod foo ::collection [c] :a-collection)
(defmethod foo String [s] :a-string)

(foo [])
:a-collection

(foo (java.util.HashMap.))
:a-collection

(foo "bar")
:a-string

此功能很棒。我试图了解技术原因,为什么它优于(例如)java中基于实例的实现。在我看来,函数在本质上与更好的语法等效。

public <T> String foo(final T t) {
    if (t instanceof Collection) {
        return "a-collection";
    } else if (t instanceof String) {
        return "a-string";
    } else {
        throw new IllegalArgumentException("Undefined - no available dispatch");
    }
}

为什么多方法被认为是基于访问者模式的双重调度的绝佳替代方法,而instanceof却不是在看来它们实际上在做相同的事情,是什么原因呢?

iCMS 回答:怎么是“ isa”?基于多方法的语法多于instanceof?

注释中讨论的好处之一是defmultidefmethod可以由不同的用户在不同的文件中完成。一个很好的例子是Clojure自己的print-method多方法。

From the docs,我们将看到如何为创建的新记录类型定义自定义print-method

(deftype XYZ [])

; without custom print-method defined:
user=> (prn (XYZ.))
#<XYZ user.XYZ@2670d85b> 

; Note,this hooks into the pre-existing `(defmulti print-method ...)`
(defmethod print-method XYZ [v ^java.io.Writer w] 
  (.write w "<<-XYZ->>"))

; with print-method
user=> (prn (XYZ.))
<<-XYZ->>

因此,尽管它与巨型cond语句相似,但更灵活,更干净。

本文链接:https://www.f2er.com/2187354.html

大家都在问