2

最初に call-next-method を呼び出し、次に別のクラスの make-instance を呼び出して、作成された X のインスタンスを提供する、クラス X の initialize-instance の (:around 修飾された) スペシャライザーを作成したいと考えています。 initialize-instance :around メソッド内で作成されたインスタンスを取得しますか? (もちろん、call-next-method を呼び出した後で、:around の終了側にいると仮定します)

編集: クラス A は、互いの ID を保持するそれぞれのスロットを介してクラス B と双方向の関係を持っていますが、クラス A はクラス B の ID を必要としますが、反対は必要ありません。だから私が望むフローは次のとおりです。

  1. メイクインスタンス「classA
  2. initialize-instance :around classA の内部では、次のようになります。

    私。インスタンスのクラス B を作成し、id-of-B を取得します。

    ii call-next-method id-of-B を追加

    iii classB ポイントの対応する id-of-A スロットを、作成した classA インスタンスに設定します (これが私の最初の質問の理由です)

今、私は [i] in :before と [iii] in :after を行うことができましたが、できません: クラス 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 に答える