Class 是否可以在现有类中动态添加一个以上的超类

Class 是否可以在现有类中动态添加一个以上的超类,class,lisp,common-lisp,clos,Class,Lisp,Common Lisp,Clos,在公共Lisp CLOS中 是否可以动态地再添加一个超类 在现有类中 更新: 我想定义defassoc这类宏,它将关联一些行为 使用相同参数的方法/函数 e、 g 扩展到 (symbol-macrolet ((name1 (name ((corresponding-task task g) s))) (record1 (record ((corresponding-task task g) s)))) (defmethod gname :after (s

在公共Lisp CLOS中

是否可以动态地再添加一个超类 在现有类中

更新:

我想定义defassoc这类宏,它将关联一些行为 使用相同参数的方法/函数

e、 g

扩展到

(symbol-macrolet ((name1 (name ((corresponding-task task g) s)))
                  (record1 (record ((corresponding-task task g) s))))
  (defmethod gname :after (s (g group))
            (let ((n name1) (r record1))
              (if (and name1 record1)
                  (display name1 record1)
                  (call-next-method)))))
在这里,它可以确保何时调用(gname(s(g组)) 这里应该是对组的相应任务的调用

(name ((corresponding-task task g) s)
(record ((corresponding-task task g) s)
我用了这个宏

(defmacro defassoc ((main-method main-method-lambda-list)
                    funspec-list &body body)
  `(symbol-macrolet ,(mapcar (lambda (fspec)
                               (destructuring-bind (name f) fspec
                                 (list name f)))
                             funspec-list)
     (defmethod
       ,main-method ,mod ,main-method-lambda-list
       ,@(if body
             body
             `(if (and
                   ,@(mapcar (lambda (e)
                               (car e))
                             funspec-list))
                  (call-next-method)))))
但问题是它会覆盖

(defmethod gname :after (s (g group))
      ...)
(如果它有,我可以验证它是否有,)

但我希望它适用于任何对象,无论它是否有覆盖该方法

因此,基本上应该需要对类和方法中的任何东西的代码进行更改

所以我决定动态添加父类来定义这个方法


另一种方法可以是defadvidefwrapper,但它不存在于SBCL中。

是的,这是可能的。最简单的方法是简单地重新定义类。您可以通过发出另一个调用
DEFCLASS
。如果您想做更复杂的事情,您必须求助于MOP(元对象协议).基本上,你想做的每件事都可以使用MOP,但我需要更详细的信息来说明你想做什么,以便进一步解释

(defmethod gname :after (s (g group))
      ...)