4.3.1. クラスの紹介
クラスは、インスタンスと呼ばれる他のオブジェクトの集合の 構造と動作を決定するためのオブジェクトです。
クラスは他のひとつ以上のクラスから構造と動作を継承できます。 クラスが継承する目的で他のクラスを参照しているようなクラスは、 それら各クラスのサブクラスであると言われます。 継承の目的で指定されているクラスは、 継承しているクラスのスーパークラスであると言われます。
クラスは名前を持つことができます。 class-name
関数はクラスオブジェクトを引数に取り、 その名前を返却します。 匿名のクラスの名前はnil
です。 シンボルはクラスの名前になれます。 find-class
関数はシンボルを受け取り、 そのシンボルの名前のクラスを返却します。 もしあるクラスにおいて、 その名前がシンボルであり、 その名前のクラスが、あるクラスの名前を指定しているときは、 そのあるクラスは正しい名前を持っていると言います。 つまり、クラスC
が正しい名前を持つとは、 S = (class-name C)
でありかつC = (find-class S)
のときです。 注意しなければならないとは、 (find-class S1) = (find-class S2)
でありかつS1 /= S2
の可能性もあるということです。 もしC = (find-class S)
であるなら、 C
はS
という名前を持ったクラスであると言います。
もしクラスC2
がクラスC1
のスーパークラスであると その定義で明示的に指定されたとき、 クラスC1
はクラスC2
のdirect
スーパークラスです。 このような場合、C2
はC1
のdirect
サブクラスです。 もし1 <= i<n
のCi+1
がCi
のdirect
スーパークラスのようなとき クラスC2, ..., Cn-1
という順列が存在するのであれば、 クラスCn
はクラスC1
のスーパークラスです。 このような場合、C1
はCn
のサブクラスです。 クラスは自分自身がスーパークラスでもなければ サブクラスでもないことを考慮されます。 つまり、C1
がC2
のスーパークラスのときはC1 /= C2
です。 クラスC
とその全てのスーパークラスを含む集合は、 「C
とそのスーパークラス」と呼ばれます。
各クラスはクラス優先順位リストを持っており、 それは与えられたクラスとそのスーパークラスの集合の 全体の順序を表すものです。 全体の順序はもっとも特定的なものから そうでないものの順番のリストで表現されます。 クラス優先順位リストはいろいろなところで使われます。 一般的にはもっとも特定的なクラスが、 継承によって他の特定的ではないクラスの機能を シャドウするのに使います。 メソッドの選択とmethod-combination
の処理は、 もっとも徳敵的なものからそうではないもののメソッドの順番を クラス優先順位リストから使います。
クラスが定義されたとき、定義フォームに記載される direct
スーパークラスの順番が重要になります。 各クラスは、その定義フォームに記載される direct
スーパークラスに従ったクラスが含まれるリストである、 ローカルの優先順位を持ちます。
クラス優先順位リストは常に各クラスのローカルの優先順位を リストとして含みます。 各ローカルの優先順位の中のクラスは、 同じ順番でクラス優先順位リストの中に現れます。 もしローカルの優先順位にお互いが含まれていないときは、 クラス優先順位リストは構築することができず、 エラーが発生します。 クラス優先順位リストとそれらの計算は、4.3.5. クラス優先順位リストの決定で説明されます。
クラスは非循環有向グラフで編成されます。 t
とstandard-object
という名前の 2つの特別なクラスがあります。 t
というクラスはスーパークラスを持ちません。 これは自分自身を除く全てのクラスのスーパークラスです。 standard-object
というクラスは、 クラスstandard-class
のインスタンスであり、 これは自分自身を除くクラスstandard-class
のインスタンスである、 全てのクラスのスーパークラスです。
オブジェクトシステムのクラス空間は、型空間と対応があります。 この説明で指定されている多くの標準の型は、 その型として同じ名前を持つ対応したクラスがあります。 いくつかの型は、対応したクラスを持っていません。 型とクラスシステムの等号については、4.3.7. 型とクラスの統合で説明されています。
クラスはそれ自身がクラスのインスタンスである オブジェクトによって表現されます。 オブジェクトのクラスのクラスは、 そのオブジェクトのメタクラスという語で表現されます。 誤解が生じてないならば、メタクラスという語は、 それ自身がクラスであるというインスタンスを持つ クラスを示すときに使われます。 メタクラスは、そのインスタンスであるクラスによって使用される継承の形式と、 それらのクラスのインスタンスの表現を決定します。 オブジェクトシステムはデフォルトのメタクラスである standard-class
を提供しており、 それは多くのプログラムに適しています。
特に指定された場合を除いて、 全てのクラスは標準でstandard-class
クラスのインスタンスであり、 全てのジェネリック関数は標準で standard-generic-function
クラスのインスタンスであり、 全てのメソッドはstandard-method
クラスのインスタンスです。