首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以在现有类中动态地添加一个超类?

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

Stack Overflow用户
提问于 2011-08-15 15:07:24
回答 1查看 236关注 0票数 3

共通-Lisp CLOS

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

更新:

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

例如:

代码语言:javascript
复制
(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))))

扩展到

代码语言:javascript
复制
(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 ( (g组))被调用,这里应该调用相应的任务到组。

代码语言:javascript
复制
(name ((corresponding-task task g) s)
(record ((corresponding-task task g) s)

我用了这个宏

代码语言:javascript
复制
(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)))))

但问题是它将覆盖

代码语言:javascript
复制
(defmethod gname :after (s (g group))
      ...)

(如果它有,我可以验证它是否有,)

,但是我希望它对任何对象都有效,不管它是否有要覆盖的方法,

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

因此,我决定动态添加父类来在其上定义此方法。

其他的方法可以是defadvidefwrapper,但它并不存在于SBCL中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-15 15:40:10

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7066604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档