% Standard-Generic-Function UPDATE-INSTANCE-FOR-DIFFERENT-CLASS
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によって無視されます。