7.5.3. スロットの継承とスロットオプション
クラスC
のインスタンスについて、アクセス可能な全てのスロットの名前の集合は、 クラスC
とそのスーパークラスによって定義されたスロットの名前の集合の和集合となります。 インスタンスの構造は、そのインスタンスの局所スロットの名前の集合です。
単純な場合として、たった1つのクラスC
と、そのスーパークラスにて、 名前ありのスロットを定義したとします。 もしスロットがC
のスーパークラスによって定義された場合、 そのスロットは継承されたと言えます。 スロットの特性は、クラス定義のスロット指定子によって決定されます。 スロットS
を定義したクラスを考えます。 もしスロットオプション:alocation
が:instance
ならば、S
は局所スロットであり、 C
の各インスタンスはS
と名前の付いた独自のスロットをもち、 S
には独自の値が格納されます。 もしスロットオプション:allocation
が:class
ならば、 S
は共有スロットであり、S
が定義されたクラスに値が格納されます。 そしてC
の全てのインスタンスは、その1つのスロットにアクセスできます。 もしスロットオプション:allocation
が省略された場合は、:instance
が使用されます。
一般的に、複数のクラスである、C
とそのスーパークラスは、 1つの名前付きのスロットを定義できます。 そのような場合、C
のインスタンスに対しては、 与えられた名前に対してただ1つのスロットがアクセス可能です。 そしてそのスロットの特性は、いくつかのスロットの指定子を 計算によって結び付けたものになります。 計算方法を次に示します。
1つのスロットの名前に対する全てのスロット指定子は、 クラスC
のクラス優先順位リストのクラスに従って、 最も特定的なものからそうでないものへ順序付けられます。 どのスロット指定子の直下に特定されるかの全ての参照は、この順序に従って調査されます。
スロットの確保は、最も特定的なスロット指定子によって制御されます。 もし最も特定的なスロット指定子がスロットオプション:allocation
を含んでいなかった場合は、 :instance
が使用されます。 特定的ではないスロット指定子は、確保には影響しません。
スロットのデフォルト初期値フォームは、 スロットオプション:initform
が含まれる最も特定的なスロット指定子の、 :initform
の値になります。 もしスロット指定子が:initform
を持っていなかった場合、 スロットはデフォルト初期値フォームを持ちません。
スロットの値は、常に型(and T1 ... Tn)
となるでしょう。 ここでT1 ... Tn
とは、全てのスロット指定子が持っているスロットオプション:type
の値です。 もしスロット指定子がスロットオプション:type
を持っていなかった場合は、 スロットの値は常に型t
となります。 スロットの型に合っていない値をスロットに格納しようとした結果については未定義です。
指定したスロットを初期化する際に使用する初期化引数の集合は、 全てのスロット指定子の中のスロットオプション:initarg
で定義された 初期化引数の和集合です。
スロットのドキュメント文字列は、 スロットオプション:documentation
が含まれる最も特定的なスロット指定子の、 :documentation
の値になります。 もしスロット指定子が:documentation
を持っていなかった場合、 スロットはドキュメント文字列を持ちません。
スロットの確保の規則では、共有スロットはシャドウすることができます。 例えば、もしクラスC1
が、スロットの名前S
、 スロットオプション:allocation
が:class
のスロットを定義した場合、 そのスロットは、C1
とその全てのサブクラスのインスタンスからアクセス可能です。 しかし、もしC2
がC1
のサブクラスであり、C2
が名前S
のスロットを定義した場合、 C2
とその全てのサブクラスのインスタンスでは、C1
のスロットは共有されません。 クラスC1
が共有スロットを定義したときは、 次の条件の時にC1
のどんなサブクラスC2
でもその単一のスロットは共有されます。 それは、C2
のdefclass
フォームで同じ名前のスロットを定義していないとき。 あるいは、C2
のクラス優先リスト内において 同じ名前のスロットを定義しているクラスを見たとき、 C1
よりも先導しているものがC2
のスーパークラスに存在していない場合です。
型の規則による結果は、スロットの値が関連するスロットの 各スロット指定子の型の条件を満たすことです。 スロットの型の条件が守られていない値を スロットに格納しようとした際の結果は未定義なので、 スロットの値は型の条件の安全性を失うでしょう。
スロットオプション:reader
, :writer
, :accessor
は、 スロットの特性を宣言すると言うよりは、 メソッドを作成するものです。 reader
とwriter
メソッドは、 7.6.7. メソッドの継承で説明される定義により継承されます。
スロットにアクセスするメソッドは、スロットの名前と、 スロットの値の型のみを使用します。 例えば、スーパークラスが、 指定した名前により共有スロットにアクセスすることを期待するメソッドを提供した場合、 またサブクラスが同じ名前で局所スロットを定義した場合を考えます。 もしスーパークラスによって提供されたメソッドを、 サブクラスのインスタンス上で使用した場合、 メソッドは局所スロットにアクセスします。