【问题标题】:Adding fields to a proxied class in Clojure在 Clojure 中向代理类添加字段
【发布时间】:2010-06-16 20:45:36
【问题描述】:

我正在使用“代理”在 Clojure GUI 应用程序中扩展各种 Swing 类,通常使用如下代码:

(def ^JPanel mypanel 
  (proxy [JPanel] []
    (paintComponent [#^Graphics g]
      (.drawImage g background-image 0 0 nil))))

这很好用,但我不知道如何向新扩展的类添加其他字段,例如使背景图像成为可以随后更新的字段。这在 Java 中是非常简单和常见的做法。

在 Clojure 中是否有很好的方法来做到这一点?或者有没有其他首选方法可以达到同样的效果?

【问题讨论】:

  • 无耻的自我推销:我 wrote a blog post 不久前谈到了代理及其陷阱。
  • 谢谢 - 非常有用的指南!

标签: java swing proxy clojure extends


【解决方案1】:

你可以这样使用:

(defn ^JPanel mypanel [state]
  (proxy [JPanel] []
    (paintComponent [#^Graphics g]
      (do
        (comment do something with state)
        (.drawImage g background-image 0 0 nil)))))

或使用任何其他外部函数/参考。

【讨论】:

  • 非常有趣的想法 - 你的意思是用 defn 而不是 def?
  • doto 在这里似乎很合适:(doto g (.drawImage...) (...))
  • hmmmm...有人知道 Clojure 是如何在内部实现这一点的吗?它实际上是在向代理类添加一个字段吗?
  • 它是defn 而不是def——def 甚至无法编译——我冒昧地进行了更正。至于实现,这里没有proxy 特有的魔法;方法体是闭包,可以引用在其词法范围内可见的任何内容。顺便说一句,方法体也有一个隐含的do,所以上面的do 是不必要的。
  • 顺便说一句,我真的很喜欢这个问题和这个答案。 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-31
  • 2010-10-13
  • 2014-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多