4.3.7. 型とクラスの統合

UP


4.3.7. 型とクラスの統合

オブジェクトシステムは、クラス空間と型の空間を対応付けます。 全てのクラスは正しい名前を持ち、 それは対応する同じ名前の型を持ちます。

全てのクラスの正しい名前は、有効な型指定子です。 さらに全てのクラスオブジェクトは有効な型指定子です。 したがって式(typep object class)は もしobjectのクラスがclassそれ自身であるか、 あるいはクラスのサブタイプであるときは、 trueとして評価されます。 式(subtypep class1 class2)の評価は、 もしclass1class2のサブタイプであるか、 あるいはそれらが同じクラスであるときは、 値truetrueが返却され、 それ以外のときは、値falsetrueが返却されます。 式(type-of I)を評価するとき、 ISという名前のクラスCのインスタンスであり、 Cstandard-classのインスタンスのとき、 もしSCの正しい名前であるときは 式はSを返却します。 それ以外のときは、式はCを返却します。

クラスの名前とクラスオブジェクトは型指定子なので、 それらは特殊フォームであるtheの中と、 型宣言の中で使用されます。

多くの型指定子は、全てではありませんが その型と対応する同じ正しい名前を持ったクラスが事前に宣言されています。 それらの型指定子はfigure_4-8にリストされています。 例えば型arrayは、対応するarrayという名前のクラスを持ちます。 リストにはない型指定子で、 例えば(vector double-float 100)のようなものは 対応するクラスを持ちません。 deftypeの操作は、どんなクラスも生成しません。

事前に宣言されている型指定子に対応する各クラスは、 それぞれの処理系の裁量によって 3つの方法のうちのひとつで実装することができます。 それは、standard-class, structure-class, そしてシステムクラスです。

built-in-classは 機能に制限があるか、あるいは特別な表現を持った 一般化されたインスタンスのひとつです。 defclassによってbuilt-in-classクラスの サブクラスを定義しようとしたときは、 エラーが発生します。 make-instanceを呼び出して built-in-classクラスの一般化されたインスタンスを作成しようとしたときは、 エラーが発生します。 built-in-classクラスの一般化されたインスタンスに slot-valueを呼び出したときは、 エラーが発生します。 built-in-classクラスを再定義するか、 built-in-classクラスのインスタンスのクラスを change-classによって変更しようとしたときは、 型errorのエラーが発生します。 しかし、built-in-classクラスはメソッドの特定パラメーターに使用できます。

クラスがbuilt-in-classクラスかどうかは メタクラスを確認することによって決定することができます。 standard-classはクラスstandard-classのインスタンスであり、 built-in-classはクラスbuilt-in-classのインスタンスであり、 structure-classはクラスstructure-classのインスタンスです。

defstruct:typeオプションを使用しなかったときに 生成されるそれぞれの構造体の型は、 対応するクラスを持っています。 このクラスは、クラスstructure-classの一般化されたインスタンスです。 defstruct:includeオプションは、 includeの構造体の型に対応するクラスのダイレクトサブクラスを生成します。

本仕様で定義されたクラスのインスタンスに対する 本仕様で定義された関数の動作にスロットが関与するかどうかは、 仕様でスロットが明示的に定義されている場合を除き、 実装依存です。

本仕様で定義されたクラスが、 特定の実装において本仕様で定義されていないスロットを持つ場合、 これらのスロットの名前は 本仕様で定義されたパッケージの外部シンボルであってはならず、 またCL-USERパッケージでアクセス可能であってはいけません。

多くの標準的な型指定子に対応するクラスを指定する目的は、 ユーザーがこれらの型を識別するメソッドを書くことができるようにするためです。 メソッドの選択には、 各クラスに対してクラス優先順位リストを決定できることが必要です。

型指定子間の階層的な関係は、 それらの型に対応するクラス間の関係によって反映されます。

figure_4-8は事前に宣言されている型指定子に対応された クラスの集合を示します。

arithmetic-error generic-function simple-error
array hash-table simple-type-error
bit-vector integer simple-warning
broadcast-stream list standard-class
built-in-class logical-pathname standard-generic-function
cell-error method standard-method
character method-combination standard-object
class null storage-condition
complex number stream
concatenated-stream package stream-error
condition package-error string
cons parse-error string-stream
control-error pathname structure-class
division-by-zero print-not-readable structure-object
echo-stream program-error style-warning
end-of-file random-state symbol
error ratio synonym-stream
file-error rational t
file-stream reader-error two-way-stream
float readtable type-error
floating-point-inexact real unbound-slot
floating-point-invalid-operation restart unbound-variable
floating-point-overflow sequence undefined-function
floating-point-underflow serious-condition vector
function simple-condition warning

Figure 4-8. 事前に宣言されている型指定子に対応したクラス

これらの各クラスの要素として指定されるクラス優先順位リストの情報は、 オブジェクトシステムで必要とされるものです。

個々の実装は、他の型指定子が対応するクラスを持つような定義で拡張できます。 個々の実装は、標準として規定された型の関係と型の疎の関係の要件に違反しない限り、 他のサブクラスの関係を追加し、 クラス優先順位リストに他の要素を追加するように拡張できます。 ダイレクトスーパークラスを持たずに定義された標準クラスは、 表中のtというクラスを除く すべてのクラスと疎の関係であることが保証されます。


TOP, Github