7.5.3. スロットの継承とスロットオプション

UP


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つのスロットがアクセス可能です。 そしてそのスロットの特性は、いくつかのスロットの指定子を 計算によって結び付けたものになります。 計算方法を次に示します。

スロットの確保の規則では、共有スロットはシャドウすることができます。 例えば、もしクラスC1が、スロットの名前S、 スロットオプション:allocation:classのスロットを定義した場合、 そのスロットは、C1とその全てのサブクラスのインスタンスからアクセス可能です。 しかし、もしC2C1のサブクラスであり、C2が名前Sのスロットを定義した場合、 C2とその全てのサブクラスのインスタンスでは、C1のスロットは共有されません。 クラスC1が共有スロットを定義したときは、 次の条件の時にC1のどんなサブクラスC2でもその単一のスロットは共有されます。 それは、C2defclassフォームで同じ名前のスロットを定義していないとき。 あるいは、C2のクラス優先リスト内において 同じ名前のスロットを定義しているクラスを見たとき、 C1よりも先導しているものがC2のスーパークラスに存在していない場合です。

型の規則による結果は、スロットの値が関連するスロットの 各スロット指定子の型の条件を満たすことです。 スロットの型の条件が守られていない値を スロットに格納しようとした際の結果は未定義なので、 スロットの値は型の条件の安全性を失うでしょう。

スロットオプション:reader, :writer, :accessorは、 スロットの特性を宣言すると言うよりは、 メソッドを作成するものです。 readerwriterメソッドは、 7.6.7. メソッドの継承で説明される定義により継承されます。

スロットにアクセスするメソッドは、スロットの名前と、 スロットの値の型のみを使用します。 例えば、スーパークラスが、 指定した名前により共有スロットにアクセスすることを期待するメソッドを提供した場合、 またサブクラスが同じ名前で局所スロットを定義した場合を考えます。 もしスーパークラスによって提供されたメソッドを、 サブクラスのインスタンス上で使用した場合、 メソッドは局所スロットにアクセスします。


TOP, Github