【发布时间】:2016-02-17 16:14:24
【问题描述】:
我想在类对象上定义方法,这些方法基于类的祖先继承,就像实例的方法继承一样。有没有办法做到这一点?
以下是不起作用的:eql-method 专业化。考虑这个例子:
(defclass animal ()())
(defclass bird (animal)())
(defclass woodpecker (bird)())
(defmethod wings-p ((animal-class (eql (find-class 'animal)))) nil)
(defmethod wings-p ((bird-class (eql (find-class 'bird)))) t)
调用(wings-p (find-class 'woodpecker)) 会生成一个no-method-error,你就会明白为什么——对于任何方法专家来说,woodpecker 类显然不是eql。
我想在bird 和animal 上定义“方法”,这样当我在(find-class woodpecker) 上调用wings-p 时,wings-p 返回t。
我觉得这是几乎所有其他 OO 系统的标准功能,但我不记得如何使用 CLOS 来做到这一点。
【问题讨论】:
-
这在 Java、C# 或 C++ 中不是标准的,静态方法在逻辑上是等效的。在这些语言中,您必须指定另一个类,即使它恰好是基类。
标签: oop common-lisp clos ansi-common-lisp