% 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が矛盾していたとき、エラーが発生します。