Когда вы расширяете класс Java в Clojure и определяете метод с тем же именем, что и в этом классе, что происходит? - PullRequest
2 голосов
/ 11 июля 2009

Я читал через Программирование Clojure, и у меня возникли проблемы с пониманием основного примера взаимодействия Java со Стюартом Он расширяет DefaultHandler и создает метод startElement, а затем передает этот обработчик в анализатор XML. Что я не понимаю, так это то, что происходит. Его реализация startElement переопределяет определенную в DefaultHandler? Я не совсем понимаю. У меня нет опыта работы с Java, и мало у меня с ориентацией на объекты.

Спасибо!

Ответы [ 2 ]

6 голосов
/ 11 июля 2009

Мне не принадлежит книга, но я нашел код и похоже, что ты прав. Вот функция (для других, чтобы увидеть):

(def print-element-handler
  (proxy [DefaultHandler] [] 
   (startElement            
     [uri local qname atts] 
     (println (format "Saw element: %s" qname)))))

Ты прав насчет того, что он делает. Прокси-оператор создает новый класс, эквивалентный этому Java-коду:

public class SomeNewClass extends DefaultHandler {
    public void startElement(String uri,
                     String localName,
                     String qName,
                     Attributes attributes) {
        System.out.println(*stuff*);
    }
}

Таким образом, прокси-оператор определяет этот класс и дает вам экземпляр, который теперь содержится в print-element-handler.

0 голосов
/ 11 июля 2009

Взглянув на документацию по Java для DefaultHandler, я ответил на мой собственный вопрос. 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

По умолчанию ничего не делать. Разработчики приложений могут переопределить этот метод в подклассе для выполнения определенных действий в начале каждого элемента (таких как выделение нового узла дерева или запись вывода в файл).

...