Common Lisp 多个元类

Common Lisp Multiple Metaclasses

最近发现了 weblocks, I would like to combine it with the ORM library mito 的活跃分支。

Weblocks 定义了一个宏 defwidget,它实际上像这样包装 defclass

(defclass my-class ()
  ((slot))
  (:metaclass weblocks/widgets/mop:widgets-class))

同时 Mito 的工作方式如下:

(defclass my-class ()
  ((...))
  (:metaclass mito:dao-table-class))

我怎样才能使下面的工作正常?

(defclass my-class ()
  (...))

(defvar *obj* (make-instance 'my-class))

(render *obj*) ;render from weblocks

(save-dao *obj*) ;save-dao from mito

(my-method *obj*)

我尝试过继承,但在某些方面失败了。我只用了很短的时间 CLOS。因此我无法判断频谱的位置

"I'm stupid <=====> This is impossible"

我站着。任何帮助将不胜感激。

I've tried inheritance, but failed in some different ways. I've only used CLOS a short time. Thus I have trouble gauging where on the spectrum ...

别担心,没有 CLOS 经验的直接跳到元对象肯定很困难,我推荐阅读元对象协议的艺术,(也称为 "AMOP",作者 Gregor Kiczales 和 Jim Des Rivieres ). http://metamodular.com/CLOS-MOP.

上有 Robert Strandh 编写的第 5 章和第 6 章的 HTML 版本

您想定义一个混合元class,它继承自两个元class。

(defclass hybrid-metaclass (mito:dao-table-class
                            weblocks:widget-class)
  ())

如果您使用上述元 class 定义 class,您将收到此警告:

;; WARNING: #<HYBRID-METACLASS COMMON-LISP-USER::MY-WIDGET {100B8FE683}> is not
;; defined to be a subclass of WEBLOCKS:WIDGET; consider adding WEBLOCKS:WIDGET
;; or a subclass thereof to the superclass list

widget-class metaclass 期望其所有 classes 继承自基础 class、weblocks:widget.

让我们为我们的混合元定义这样一个基础对象class:

(defclass hybrid-widget (weblocks:widget) ()
  (:metaclass hybrid-metaclass))

这里,hybrid-widget 继承自 weblocks:widget,并具有用于 metaclass hybrid-metaclass。您所有的小部件都应继承自此 class 并具有 for metaclass hybrid-metaclass(随意寻找更好的名称)。

即使可以按照@coredump 的建议解决,我也不建议您将模型(存储和业务逻辑)和小部件(这些对象的表示)混合在一个 class.

通常,我用一个指向对象的插槽来定义我的小部件。这样,您还可以定义包含对象列表的小部件。当为每个单独的对象制作一个小部件没有意义时,它很有用。

当您需要将对象的表示与其他块分开更新以作为对某些操作的响应时,例如将任务标记为完成时,您只需要在对象和小部件之间进行 1-1 link。