我一直在阅读编程Clojure,我在理解Stuarts主Java Interop示例时遇到了一些麻烦。他扩展了DefaultHandler,并创建了一个startElement方法,然后将该处理程序传递给XML解析器。我不明白的是,到底发生了什么。他的startElement实现是否覆盖了DefaultHandler中定义的实现?我糊涂了。我没有使用Java的经验,也没有面向对象的经验。
谢谢!
答案 0 :(得分:6)
我不拥有这本书,但我找到了code,看起来你是对的。这是函数(供其他人看):
(def print-element-handler
(proxy [DefaultHandler] []
(startElement
[uri local qname atts]
(println (format "Saw element: %s" qname)))))
你说的是对的。 proxy语句创建了一个新类,即此Java代码的等价项:
public class SomeNewClass extends DefaultHandler {
public void startElement(String uri,
String localName,
String qName,
Attributes attributes) {
System.out.println(*stuff*);
}
}
因此,proxy语句定义了该类,并为您提供了一个实例,该实例现在保存在print-element-handler中。
答案 1 :(得分:0)
浏览DefaultHandler的Java文档回答了我自己的问题。 http://java.sun.com/j2se/1.4.2/docs/api/org/xml/sax/helpers/DefaultHandler.html#startElement%28java.lang.String,%20java.lang.String,%20java.lang.String,%20org.xml.sax.Attributes%29
默认情况下,不执行任何操作。应用程序编写者可以在子类中重写此方法,以在每个元素的开头采取特定操作(例如,分配新的树节点或将输出写入文件)。