Lisp:如何在initialize-instance:around方法中获取创建的实例

时间:2011-04-28 10:21:18

标签: lisp common-lisp clos

我想为类X创建一个初始化实例的(:around qualified)特化器,它将首先调用next-method,然后调用另一个类的make-instance,为其提供创建的X实例。如何在initialize-instance:around方法中获取创建的实例? (假设当然在调用了call-next-method之后,所以我们处于:周围的结束方面)

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

  1. make-instance'classA
  2. 在initialize-instance中:围绕classA我会:

    我。 make-instance classB和aquire id-of-B。

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

    iii将classB指向的相应id-of-A插槽设置为我们创建的classA实例(这是我原来的问题原因)

  3. 现在我可以做到[i]之前和[iii] in:之后,但我不能: 类A和B是通过大象的持久类,我想将整个流包装在一个我不想跨越多种方法的事务中。对于熟悉elephant的人,我想使用ensure-transaction包装器,我不想在不同的点使用显式的begin和commit函数调用。

2 个答案:

答案 0 :(得分:6)

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

(defmethod initialize-instance :around ((created myclass) ...)
  ;; do something with created
  created)

答案 1 :(得分:4)

您通常使用:after方法,而不是:around方法。除非你深入研究CLOS的内涵,否则对未初始化的实例做任何事都没有多大意义。该实例作为initialize-instance的第一个参数提供。

要进行更深层次的治疗,请查看CLHS, section 7.1