Я использую "прокси" для расширения различных классов Swing в приложении GUI Clojure, обычно с кодом, который смотрит что-то как:
(def ^JPanel mypanel
(proxy [JPanel] []
(paintComponent [#^Graphics g]
(.drawImage g background-image 0 0 nil))))
Это работает хорошо, но я не могу выяснить, как добавить дополнительные поля к недавно расширенному классу, например, делая фоновое изображение полем, которое могло быть впоследствии обновлено. Это было бы довольно легкой и обычной практикой в Java.
Существует ли хороший способ сделать это в Clojure? Или там другой предпочтительный метод состоит в том, чтобы достигнуть того же эффекта?
Вы можете использовать что-то вроде этого:
(defn ^JPanel mypanel [state]
(proxy [JPanel] []
(paintComponent [#^Graphics g]
(do
(comment do something with state)
(.drawImage g background-image 0 0 nil)))))
или любую другую внешнюю функцию / ref.