【问题标题】:Overriding multi-arity methods in proxy in clojure在clojure的代理中覆盖多参数方法
【发布时间】:2012-10-30 07:43:10
【问题描述】:

我有一个 java 类,它有 2 个方法具有相同但不同的参数(一个不带参数,另一个带 1 个参数)。我创建了一个覆盖这两种方法的代理。问题是,如果从这个 java 类调用无参数方法 - 调用基本实现而不是代理。但是,如果我直接在 obj 上调用无参数方法 - 将调用正确的代理方法。有人可以解释这种行为吗?

Test.java:

package example;

public abstract class Test {

    public void callMethods(Object obj){
        callMethods();
        callMethods2();
    }

    public void callMethods() {
        System.out.println("Default callMethods");
    }

    public void callMethods2() {
        System.out.println("Default callMethods2");
    }

}

运行.clj:

(let [obj (proxy [example.Test] []
            (callMethods
              ([] (println "Overridden callMethods"))
              ([obj] (proxy-super callMethods obj)))
            (callMethods2
              ([] (println "Overridden callMethods2"))))]
  (.callMethods obj)
  (.callMethods obj :test))

输出:

Overridden callMethods
Default callMethods
Overridden callMethods2

预期输出:

Overridden callMethods
Overridden callMethods
Overridden callMethods2

【问题讨论】:

    标签: clojure overloading arity


    【解决方案1】:

    Proxy 维护一个它为这个对象代理的方法的映射。它使用它的方法处理此映射中的任何调用,其他调用则调用该对象。 proxy-super 通过从函数方法映射中移除自身、调用自身并将自身放回后缀来实现它的魔力。在调用期间,对代理对象的该方法的任何调用都将落入代理对象。

    • 第一行输出来自代理调用,您会看到被覆盖的输出
    • 第二行来自 super 的方法,参数为零,因为当调用发生时,覆盖的方法不在对象代理方法映射中。
    • 第三行被代理,因为该方法在对象代理方法映射中。

    end of this post by Meikel Brandmeyer 描述了一个非常相似的场景。我怀疑答案是使用 gen-class 而不是代理

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-09
      • 1970-01-01
      • 2019-01-02
      • 1970-01-01
      • 1970-01-01
      • 2014-08-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多