4.3.5.2. クラス優先順位リストの決定の例

UP


4.3.5.2. クラス優先順位リストの決定の例

これは、クラスpieのクラス優先順位リストを決定する例です。 下記のクラスを定義します。

(defclass pie (apple cinnamon) ())

(defclass apple (fruit) ())

(defclass cinnamon (spice) ())

(defclass fruit (food) ())

(defclass spice (food) ())

(defclass food () ())

集合S_pieと集合Rは次のようになります。

S_pie = {pie, apple, cinnamon, fruit, spice, food, standard-object, t}
R = {(pie, apple), (apple, cinnamon), (apple, fruit), (cinnamon, spice), (fruit, food), (spice, food), (food, standard-object), (standard-object, t)}

クラスpieに先行するものはないので、 これを最初に配置し、この時点の結果は(pie)です。 Sからpieを取り除き、Rからpieに関係するペアを取り除くと、 次のようになります。

S_pie = {apple, cinnamon, fruit, spice, food, standard-object, t}
R = {(apple, cinnamon), (apple, fruit), (cinnamon, spice), (fruit, food), (spice, food), (food, standard-object), (standard-object, t)}

クラスappleに先行するものはないので、 その次に配置を行い、この時点での結果は(pie apple)になります。 appleを関係するものから取り除くと、 次のようになります。

S_pie = {cinnamon, fruit, spice, food, standard-object, t}
R = {(cinnamon, spice), (fruit, food), (spice, food), (food, standard-object), (standard-object, t)}

クラスcinnamonfruitに先行するものはないので、 これまでに計算されたクラス優先順位リストの中で 一番右にあるダイレクトサブクラスを持つものが次に配置されます。 クラスapplefruitのダイレクトサブクラスであり、 クラスpiecinnamonのダイレクトサブクラスです。 クラス優先順位リストにおいて applepieの右に現れているため、 fruitが次に配置され、 この時点での結果は(pie apple fruit)になります。 集合から取り除くと次のようになります。

S = {cinnamon, spice, food, standard-object, t}
R = {(cinnamon, spice), (spice, food), (food, standard-object), (standard-object, t)}.

クラスcinnamonが次に配置され、 この時点での結果は(pie apple fruit cinnamon)です。 集合は次のようになります。

S = {spice, food, standard-object, t}
R = {(spice, food), (food, standard-object), (standard-object, t)}.

クラスspice, food, standard-object, tは この順番で追加され、クラス優先順位リストは次のようになります。

(pie apple fruit cinnamon spice food standard-object t)

順番付けできないクラス定義の集合を書くことも可能です。 例えば次の通り。

(defclass new-class (fruit apple) ())
  
(defclass apple (fruit) ())

局所的なスーパークラスの順序を保つためには、 クラスfruitappleに先行しなければいけません。 クラスapplefruit先行しなければならず、 なぜならクラスはそれ自身のスーパークラスに対して 常に先行しなければいけないからです。 このような状況が生じたとき、 システムがnew-classのクラス優先順位リストを 計算しているときにこの状況が発生した時点でエラーを通知します。

下記の例は衝突が生じる定義の集合です。

(defclass pie (apple cinnamon) ())

(defclass pastry (cinnamon apple) ())

(defclass apple () ())

(defclass cinnamon () ())

pieのクラス優先順位リストは、 (pie apple cinnamon standard-object t)です。

pastryのクラス優先順位リストは、 (pastry cinnamon apple standard-object t)です。

pieのスーパークラスの順序で applecinnamonに先行することは問題ありませんし、 同様にpastryの順序で applecinnamonに先行することは問題ありません。 しかし、piepastryの両方をスーパークラスとする 新しいクラスを作ることはできません。


TOP, Github