在Common Lisp中,是否存在一种用于定义匿名类的方式,用于一次性“小型接口实现者”中的一个“小型接口实现者”?
例如,
this.addListener(new Listener() {
public void listen() {...}
});
为:
(defgeneric listen (object))
(add-listener #<this>
(make-anonymous-instance
(listen (object) ...)))
答案 0 :(得分:7)
Common Lisp方法属于泛型函数,而不是类,因此匿名实例并不真正有意义。根据具体情况,通过闭包或EQL专用器,可以实现类似的目的。
对评论进行了扩展:
在CL定义方法中,不是顶级方法是可能的,但不是一个好主意。我建议只是正常添加方法,如果不需要实际实例,可能EQL专门用于符号或其他常量。
如果定义行为内联更有用,那么它表明接口被错误设计并且应该采用闭包而不是对象。如果您无法修复接口本身,那么您可以定义一个类,其唯一目的是包装闭包并添加一个调用该闭包的方法,然后只创建一个具有适当行为的实例。
答案 1 :(得分:2)
在CLOS开发的早期阶段,提出了类似GENERIC-FLET
的内容。但它没有成为标准。
答案 2 :(得分:2)
Java中的匿名类几乎总是用于实现匿名函数和闭包。在常见的lisp中,没有必要模拟Java的匿名内部类,因为函数是Common Lisp中的第一类类型。
如果是这种情况,则Common Lisp中的代码如下所示:
(add-listener self (lambda (object) ...))