How to describe and implement and interface in common lisp
我正在实现一个图形数据结构,它将任意对象存储为顶点。我想为诸如获取对象的键之类的事情定义一个接口,以便所有顶点都可以有一个键。在我看来,这听起来像是我可能会使用 java.
之类的语言中的接口
1 2 3 4
| interface Vertex {
String key (Vertex v);
// etc...
} |
如何在普通 lisp 中模拟接口的行为?
- 只需实现一个类(如mixin)即可根据需要继承和定义泛型函数。 CLOS 具有多重继承。
正如 Rainer Joswig 在评论中提到的,在某些语言(例如 Java)使用它们的意义上,没有接口,因此您需要做的就是定义一些通用函数和可选的 mixin 类以指定为实现类的超类。
- 我认为有趣的(而不是微不足道的)是检查一个类是否实现了某个接口。在像 CLOS 这样的系统中,方法可能(并且通常在实践中)与类分开定义,这样的检查或多或少必须延迟到我认为创建类的第一个实例。然而,做一些 MOPpy 的事情来做检查应该很容易。
-
@tfb:泛型函数或多或少地颠倒了这个概念。相反,您的意思是问,这个泛型方法是否具有包含类的特化? FIND-METHOD 回答了这个问题;例如: (find-method #'stream-clear-output '() (list (find-class 'stream))
-
@tfb 我认为这就是使用 mixin 类的重点,否则它们不会起到太大的作用(方法的默认实现除外,在这种情况下,人们通常会调用这些抽象类,而不是接口)。
-
@tfb 而且,正如 BRPocock 提到的,泛型函数确实可以扭转局面。泛型函数可能具有专门针对多个参数的方法。 (在不容易获得的语言中,这通常称为多分派,并且说一个类实现方法并没有多大意义:您必须询问是否有针对某些参数集的专门方法,因为定义行为并不取决于任一类。
-
@tfb 在我在之前的评论中链接到的关于多分派的维基百科文章中,以 Common Lisp 为例,其后是文本,"在存在多分派的情况下,方法的传统思想定义在类和包含在对象中变得不那么吸引人了a€"每个碰撞方法都附加到两个不同的类,而不是一个。... [M]方法调用看起来与普通函数调用完全一样,方法不是在类中而是在通用功能。"
-
@BRPocock 这不是我要问的意思:我要问的是类 x 的实例是否具有(或将具有)泛型函数 a、b、c 的方法。我确实了解 CLOS,非常了解。