检查对象的父类

时间:2014-07-18 11:13:52

标签: inheritance lisp common-lisp clos

我想知道如何检查一个对象是某个类,还是从它派生出来的方法。 E.g:

(defclass a nil
  nil)

(defclass b (a)
  nil)

(defparameter *foo* (make-instance 'b))

(my-function *foo* 'a) ; => t
(my-function *foo* 'b) ; => t

或者,也可以理解返回给定对象(或类)的所有基类列表的函数。

2 个答案:

答案 0 :(得分:7)

使用typep

CL-USER 4 > (typep *foo* 'a)
T

CL-USER 5 > (typep *foo* 'b)
T

答案 1 :(得分:0)

您需要使用MOP(MetaObject Protocol)`class-direct-superclasses'

快速加载库close-mop并使用`class-direct-superclasses',如下所示:

CL-USER> (closer-mop:class-direct-superclasses (find-class 'number))
(#<BUILT-IN-CLASS T>)
CL-USER>

如果你有一个类的实例,你可以做

CL-USER> (let ((table (make-instance 'test-table-2)))
           (class-direct-superclasses (class-of table)))
(#<STANDARD-CLASS STANDARD-OBJECT>)} 
CL-USER>

一个可能的问题(在库中记录):如果你DEFPACKGE:USE更接近拖把,而不是使用CL,:USE close-common-lisp