class - 是否可以在现有类中动态添加一个父类(super class)

标签 class lisp common-lisp clos

在 Common-Lisp CLOS 中

是否可以动态添加一个父类(super class) 在现有类(class)中。

更新:

我想定义一种defassoc 宏来关联一些行为 使用相同参数的方法/函数

例如

(defassoc (gname (s (g group)))
    ((name1 (name ((corresponding-task task g) s)))
     (record1 (record ((corresponding-task task g) s))))
  (let ((n name1)
        (r record1))
    (if (and name1 record1)
        (display name1 record1)
        (call-next-method))))

展开为

(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 group)) 这里应该调用相应的任务来分组

(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(MetaObject Protocol)。基本上您想要做的所有事情都可以使用 MOP 实现,但我需要有关您尝试做的事情的更多详细信息,以便进一步解释。

关于class - 是否可以在现有类中动态添加一个父类(super class),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7066604/

相关文章:

php - 如何使 "PHPmailer"在函数中工作

lambda - SICP - Lambda 输出

macos - 在 Mac OS X(任何方言)上安装 lisp 的建议?

Lisp 用列表初始化变量

list - 根据某些元素对列表进行排序

common-lisp - 如何在 Common Lisp 中捕获错误消息?

vba - VBA Excel 类模块中的子属性

Python 不允许我在类定义尚未完成时使用类内部的方法

c++ - Geany 中的链接类

lisp - 根据 Lisp 中的字符匹配对列表进行排序