2

我想为一个类 X 创建一个初始化实例的 (:around 合格) 专门化器,它将首先调用下一个方法,然后调用另一个类的 make-instance,为它提供创建的 X 实例。我怎么能在 initialize-instance :around 方法中获取创建的实例?(当然假设在调用 call-next-method 之后我们处于 :around 的完成端)

编辑:A 类与 B 类通过每个插槽中的一个插槽保持另一个的 id 具有双向关系,但 A 类需要 B 类的 id,而相反则不需要。所以我想要的流程是:

  1. 生成实例'classA
  2. 在 initialize-instance :around classA 里面我会有:

    一世。make-instance classB 并获取 id-of-B。

    ii call-next-method 添加 id-of-B

    iii 将classB点对应的id-of-A slot设置为我们创建的classA实例(这是我原来提问的原因)

现在我可以在 :before 中执行 [i] 和在 :after 中执行 [iii],但我不能:A 类和 B 类是大象的持久类,我想将整个流程包装在一个我不想跨越许多方法的事务中. 对于那些熟悉大象的人,我想使用 ensure-transaction 包装器,我不想在不同的点使用显式的 begin 和 commit 函数调用。

4

2 回答 2

6

该实例作为 的第一个参数传递initialize-instance

(defmethod initialize-instance :around ((created myclass) ...)
  ;; do something with created
  created)
于 2011-04-28T12:04:18.000 回答
4

您通常会使用:after方法而不是:around方法来做到这一点。除非您深入了解 CLOS,否则对未初始化的实例执行任何操作都没有多大意义。该实例作为 的第一个参数提供initialize-instance

如需更深入的处理,请查看CLHS,第 7.1 节

于 2011-04-28T13:35:55.267 回答