2011-04-28 60 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

相關問題