2011-04-28 57 views
2

我想要为首先调用next方法的类X创建一个initialize-instance初始化实例的(:around限定的)专用器,然后将调用另一个类的make-instance,为它提供创建的X实例。我如何获得initialize-instance:around方法内创建的实例? (假设当然在呼叫接下来的方法之后,所以我们处于finilizing侧:左右)Lisp:我怎样才能得到初始化实例内创建的实例:around方法

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

  1. 化妆实例“CLASSA
  2. 内初始化实例:约CLASSA我会:

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

    II呼叫下一方法添加B ID-的-

    III设置相应的ID-的-A CLASSB指向我们创建CLASSA实例的时隙(这是我原来的问题的原因)

现在我可以[i]在:之前和[iii]在:之后,但我不能: 类A和B是通过大象的持久化类,我想将整个流程包装在一个我不想要的事务中跨越很多方法。对于那些熟悉大象的人,我想使用确保事务包装器,我不想在不同的点使用显式的开始和提交函数调用。

回答

6

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

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

等一下,怎么可能?除非您的示例中的“已创建”符号始终与在方法范围内发生更改的内容绑定。那么在call-next-method被调用之前它真的必须要做什么? – Paralife 2011-04-28 12:59:00

+3

@Paralife'created'绑定到新创建的实例。在调用'call-next-method'之前,新创建的实例只会应用默认的初始化以及上游方法应用的初始化(如果有的话)。 – WReach 2011-04-28 13:39:53

+0

你提到的默认初始化是在哪里定义的?它是依赖于实现吗?它是defclass的initforms吗? (实际上这是唯一认为对我有意义的想法) – Paralife 2011-04-28 21:34:01

4

你通常会做的与:after方法,而不是:around方法。除非你在CLOS的内部深陷其中,否则对未初始化的实例做任何事情都没有什么意义。该实例作为initialize-instance的第一个参数提供。

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

相关问题