外国語論文購読 レジュメ      530119E 中島剛志 7.1 Introduction CLOS・・・Common Lispのオブジェクト指向拡張 Common Lisp型に対応するクラスを用意 総称関数と通常関数の呼び出し方を統一 C++・・・C言語の拡張として独自に開発された CLOSが柔軟性と拡張性に重点を置いて設計されたのに対し、 C++は実行時の効率と簡便さに主眼が置かれている →この差はそれぞれもとになった言語(Common LispとC)の 影響が大きく現れている CLOSの柔軟性・・・自身をカスタマイズする機構が備わっている →「CLOSはCLOSで記述される」 多くのC++の実装は効率優先で振る舞いが固定されている 7.2 Classes and Instances CLOSの「クラス」 ・ユーザ定義クラス(User-defined Class) →defclassで定義される。C++のクラスはこれに相当 ・組み込みクラス(Built-in Class) →Common Lisp型に対応するクラスなど  make-instanceをサポートしない ・クラスのクラス(Structure-Class) クラスの原則 1.すべてのオブジェクトはクラスのインスタンスである 2.オブジェクトのクラスはそのオブジェクトの構造と振る舞いを規定する 3.CLOSではクラスもオブジェクトである(クラスオブジェクト)  (C++ではクラスはオブジェクトではない) 「クラスオブジェクト」のクラスとは? →クラスオブジェクトのクラスはそのクラスオブジェクトの  構造と振る舞いを規定する(このクラスをメタクラスという) ※CLOSはCommon Lisp型をクラスに統合することで型を組み込みクラス として、ユーザ定義クラスと同じようにメソッドの適用などを行うこ とができる C++では、関数はクラスに適応する形で記述することが可能だが、 CLOSの総称関数のように動的に適用されたりはしない 7.3 Inheritance 7.3.1 Views of the Class Hierarchy クラスの継承に伴う名前の衝突の問題を解決するために、クラス同士の関係を 把握する必要がある CLOS・・・"linear" approaches C++・・・"graph-oriented" approachesと"tree-oriented" approaches CLOSではクラス優先度リストを用いる A: (A standard-object t) B: (B A standard-object t) C: (C A standard-object t) D: (D B C A standard-object t) E: (E C B A standard-object t) すべてのクラスはクラスtを暗黙のうちにスーパークラスとして 含んでいる(ただしt自身はスーパークラスを持たない例外) tは型tとしてCommon Lisp型システムの基本であり、クラスtと してはCLOSのクラスシステムの基本となる array: (array t) complex: (complex number t) float: (float number t) またすべてのユーザ定義クラスはstandard-objectを暗黙のうちに スーパークラスとして含んでいる。クラスstandard-objectによっ てすべてのユーザ定義クラスにより継承されるデフォルトの振る 舞いを定義できる すべてのユーザ定義クラスの優先度リストは (・・・ standard-object t) という形をとる 7.3.2 Inheritance of Slots 名前の衝突 スーパークラスとサブクラスに同じ名前のスロットが存在する、 あるいは多重継承で複数のスーパークラスに同名のスロットが ある場合に、名前の衝突をどうやって解決するかがCLOSとC++ とで異なる C++では同名であってもすべてのスロットがサブクラスに継承 される。そのため、同名のスロットにアクセスする時は、どの クラスのスロットであるのかを明示しなければならない CLOSでは同名のスロットが複数存在する場合でも、オブジェク トとして作られるスロットは1つだけである。ただしそのスロ ットの特性はそれぞれのスロットの特性の組み合せに依存する。 CLOSでは同名のスロットが複数存在しないため、名前の衝突を 避けられるが、同名でいみの異なるスロットを意図せずに指定 してしまうことがある。 7.3.3 Inheritance of Methods メソッドの継承 CLOS クラスのメソッドはクラスとそのサブクラスのどのインスタン スに対しても適用可能である C++ スロットの継承と同じく、どのクラスに属するメソッドなのか を明示する必要がある