Standard Generic Function UPDATE-INSTANCE-FOR-DIFFERENT-CLASS
update-instance-for-different-class
previous current &rest initargs &key &allow-other-keys => 処理系依存
update-instance-for-different-class
(previous standard-object
) (current standard-object
) &rest initargs
previous - 元のinstanceのコピー
current - 元のinstance (変更された)
initargs - 初期化引数リスト
ジェネリック関数update-instance-for-different-class
は、 プログラマーによって呼び出されることを意図していません。 プログラマーはこの関数のメソッドを作成できます。 関数update-instance-for-different-class
は、 ただ関数change-class
によってのみ呼ばれます。
システムが提供するupdate-instance-for-different-class
の プライマリメソッドは、initargsの有効性を確認し、 もしinitargsに有効として宣言されていないものが与えられていた場合は エラーが通知されます。 このメソッドは、initargsに対応する値でスロットを初期化します。 そして新たに追加されたスロットには:initform
フォーム対応した値で初期化します。 このような動作は、ジェネリック関数shared-initialize
を 次のような引数で呼び出すことで行います。 引数は、インスタンス(current)、 新しく追加されたスロットの名前のリスト、 そして受け取ったinitargs。 新しく追加されたスロットとは、 以前のクラスに同じ名前のスロットが存在しない局所スロットのことです。
update-instance-for-different-class
のメソッドを定義することで、 インスタンス更新時の動作を指定することができます。 update-instance-for-different-class
の after
メソッドのみが定義されている場合は、 それらはシステムが提供している初期化の プライマリメソッドの後に実行されるため、 update-instance-for-different-class
の デフォルトの動作に干渉することはありません。
update-instance-for-different-class
のメソッドは、 change-class
とは違うスロットの初期化を定義できます。 change-class
のデフォルトの動作は、7.2. インスタンスのクラスの変更に定義されています。
update-instance-for-different-class
の引数は、 change-class
によって計算されます。 change-class
がインスタンスとともに起動されると そのインスタンスのコピーが生成され、 そのときchange-class
は元のインスタンスを破壊的に変更します。 update-instance-for-different-class
の最初の引数である previousはコピーであり、古いスロットの値が一時的に保存されます。 この引数はchange-class
内で動的生存期間を持ちます。 もしupdate-instance-for-different-class
から戻った後に、 何らかの方法で参照された場合、結果は未定義です。 update-instance-for-different-class
の二番目の引数である currentは変更された元のインスタンスです。 previousの使用目的は、 slot-value
か、with-slots
か、リーダーのジェネリック関数によって、 古いスロットの値を読みだしたり、 あるいは元のクラスのインスタンスとして適用できる 他のメソッドを実行したりすることです。
change-class
の例をご確認ください。
なし。
システムが提供するupdate-instance-for-different-class
の プライマリメソッドは、 初期化引数に有効として宣言されていないものが 与えられていた場合はエラーが通知されます。
change-class
, shared-initialize
, 7.2. インスタンスのクラスの変更, 7.1.4. 初期化引数の規則, 7.1.2. 初期化引数の有効性の宣言
initargsは、defclass
の:initarg
引数によって、 あるいはupdate-instance-for-different-class
か shared-initialize
のメソッドの宣言によって、 有効であると宣言されます。 update-instance-for-different-class
か shared-initialize
の各メソッドの宣言のラムダリストにある、 各キーワードパラメーター指定子のキーワード名は、 それらのメソッドが適用されるすべてのクラスに対して、 有効な初期化引数の名前として宣言されます。
update-instance-for-different-class
の返却値は、 change-class
によって無視されます。