Functional programming Clojure代理是否总是调用super.method()?

Functional programming Clojure代理是否总是调用super.method()?,functional-programming,clojure,dynamic-languages,Functional Programming,Clojure,Dynamic Languages,使用时,传递给代理的fns应该覆盖现有方法,或者它们是与super.method()一起调用的 在下面的代码中,RequestHandler.get()与代理一起调用get[] ;see: http://github.com/paulosuzart/JTornado (ns org.ctornadoweb) (import '(org.jtornadoweb Web$RequestHandler)) (import '(org.jtornadoweb HttpServer Web$Applica

使用时,传递给代理的
fns
应该覆盖现有方法,或者它们是与
super.method()
一起调用的

在下面的代码中,RequestHandler.get()与代理一起调用
get[]

;see: http://github.com/paulosuzart/JTornado
(ns org.ctornadoweb)
(import '(org.jtornadoweb Web$RequestHandler))
(import '(org.jtornadoweb HttpServer Web$Application))


(let [myHandler (proxy [Web$RequestHandler] [] 
                  (get [] 
                    (.write "Hi CLJ"))
                  (post []
                    (.write "POST")))]

(.listen
  (HttpServer.  
    (.add (Web$Application.) "/" (class myHandler))
    false nil false) 8089))
编译/继承版本也会发生同样的情况:

; Starts a JTornado HTTP Server and a sample RequestHandler.
; Bit verbose due to compilation directives. Recommendation is to generate 
; a set of macros to hide this.
(ns org.ctornadoweb
; Compiled and implements a static main method to start the server
  (:import (org.jtornadoweb HttpServer)
           (org.jtornadoweb.Web$Application)
           (org.jtornadoweb.Web$RequestHandler))
  (:gen-class :prefix "server-"))

(gen-class
 :name org.ctornadoweb.MyHandler
 :extends org.jtornadoweb.Web$RequestHandler
 :prefix "do")

(defn do-get [this]
  "Handles the HTTP GET method"
  (.write "hello clojure"))
(defn do-post [this]
  "Handles the HTTP POST method"
  (.write (.getArgument "name" "default" false)))


(defn server-main []
  "main method"
 (.listen
  (org.jtornadoweb.HttpServer.
   (.add (org.jtornadoweb.Web$Application.) "/" org.ctornadoweb.MyHandler)
     false nil false) 8089))

;use (compile 'org.ctornadoweb)
跟踪显示正在调用的代理get,然后是super.get,默认情况下抛出异常

HTTP 405: Method Not Allowed 
    at org.jtornadoweb.Web$RequestHandler.get(Web.java:72)
    at org.ctornadoweb.proxy$org.jtornadoweb.Web$RequestHandler$0.get(Unknown Source)

我试图找到一些关于Clojure代理的实际行为的词汇。有人能提供此帮助吗?

不,超级方法不会自动调用,尽管您可以使用
代理超级方法显式调用它

以下测试用例显示了它们应该如何工作:

user=> (def foo 
         (proxy [java.util.ArrayList] [] 
           (clear [] (println "not clearing"))))
#'user/foo
user=> (.size foo)
0
user=> (.add foo "hi")
true
user=> (.add foo "bye")
true
user=> (.size foo)
2
user=> (.clear foo)
not clearing
nil
user=> (.size foo)
2

如果调用了
super.clear()
,则大小将显示为0。

我怀疑您误用了
proxy
<代码>代理
创建匿名类。因此,对其调用
是非常可疑的。你应该把物体本身传递到某个地方。如果你需要一个类,你必须在AOT编译中使用
gen class
?请参见生成类仍然会导致相同的super.method()行为。知道吗?你必须在前缀中指定连字符<代码>(gen class…:前缀do-…)此时,您的类看不到实现,因此调用超级实现。