% 7.5.3. スロットの継承とスロットオプション
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. メソッドの継承で説明される定義により継承されます。
スロットにアクセスするメソッドは、スロットの名前と、 スロットの値の型のみを使用します。 例えば、スーパークラスが、 指定した名前により共有スロットにアクセスすることを期待するメソッドを提供した場合、 またサブクラスが同じ名前で局所スロットを定義した場合を考えます。 もしスーパークラスによって提供されたメソッドを、 サブクラスのインスタンス上で使用した場合、 メソッドは局所スロットにアクセスします。