[英]Make a class that extends a class with overriding in clojure
我有非常简单的java代码:
public class MessageListenerExample extends ListenerAdapter
{
@Override
public void onMessageReceived(MessageReceivedEvent event)
{
// do something with event
}
}
但是,我似乎无法理解如何将该代码转换为clojure代码。 文档和文章非常令人困惑。 我也很高兴看到更多的例子。 我也对使用implements
感兴趣。
根据您的需要,可以选择以下几种方法:
(ns your.class.Name
:extends whatever.needs.to.be.Extended)
(defn -methodYouOverride ; mind the dash - it's important
[...] ...)
除非绝对必要,否则我不建议沿着这条路走下去。 正确编译(包括AOT编译)很棘手。 最后你仍然需要使用Java互操作来处理这个类的对象,所以不确定它是否值得麻烦,这让我:
用Java编写代码并使用Java interop来处理它。
如果您确实需要创建实现某个接口的对象实例,那么它会更容易:
(reify
InterfaceYouImplement
(methodYouImplement [..] ..)
我在我的代码中使用它,用Java编码真的好多了。
您可以使用proxy
来扩展现有Java类并实现接口。 例如:
(import '[java.awt.event ActionListener ActionEvent KeyAdapter KeyEvent])
(def listener
(proxy
;; first vector contains superclass and interfaces that the created class should extend/implement
[KeyAdapter ActionListener]
;; second vector contains arguments to superclass constructor
[]
;; below are all overriden/implemented methods
(keyPressed [event]
(println "Key pressed" event))
(actionPerformed [action]
(println "Action performed" action))))
(.keyPressed listener nil)
;; => Key pressed nil
(.actionPerformed listener nil)
;; => Action performed nil
只是自己实现EventListener
,而不是使用那里的适配器类来为java程序员提供更方便的东西(但是对于clojure程序员来说却更难!)。 您将收到一个Event对象,您可以自己检查它是否是MessageReceivedEvent
的一个实例,就像适配器会为您做的那样 。
在Clojure中实现接口是通过reify
完成的 - 有关示例,请参阅https://stackoverflow.com/a/8615002/625403 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.