% 4.3.5. クラス優先順位リストの決定
4.3.5. クラス優先順位リストの決定
クラスのdefclass
フォームは、
そのクラスとそのdirect
スーパークラスの全体の順序を提供します。
その順番はローカルの優先順位と呼ばれます。
これはそのクラスとそのdirect
スーパークラスを順序付けしたリストです。
クラスC
のクラス優先順位リストは、
C
とそのdirect
スーパークラスの全体の順序であり、
これは各C
とそのdirect
スーパークラスの
ローカルの優先順位を含みます。
あるクラスは、そのdirect
スーパークラスの先に立ち、
あるdirect
スーパークラスは、
defclass
フォームのスーパークラスのリストの右側に指定された
その他の全てのdirect
スーパークラスに先立ちます。
全てのクラスC
に対して、次のような定義をします。
R_C = {(C,C1), (C1,C2), , ..., (Cn-1,Cn)}
ただしC1,...,Cn
はC
のdefclass
フォームを参考に
順序付けられたdirect
スーパークラスです。
これらの順序付けられたペアは、
クラスC
とそのdirect
スーパークラスの全体の順番を生成します。
ここでS_C
をC
とそのスーパークラスの集合とします。
ここでR
は次のようになります。
R = U_{CはS_Cの要素} R_C
(TeXで書くとR = \bigcup_{C \in S_C} R_C
)
R_C
とCはS_Cの要素
が矛盾するかどうかによって、
R
の集合が部分的な順序を生成するかもしれませんし、しないかもしれません。
それらが矛盾しないことを仮定するとR
は部分順序を生成します。
もしR_C
が矛盾しているときは、R
に一貫性が無いと言います。
C
のクラス優先順位リストの計算をするために、
R
によって生成された部分順序を反映したS_C
の要素に対して
トポロジカルソートを行います。
トポロジカルソートが、Rに関して他のクラスが先行しない
2つ以上のクラスの集合からクラスを選択しなければならないとき、
選択されるクラスは、以下に述べるように決定的に選ばれます。
もしR
が矛盾していたとき、エラーが発生します。