外国語論文購読 レジュメ      530119E 中島剛志 7.4 Generic Functions and Methods ・CLOSの総称関数はCommon Lispの通常関数と同じ文法で 呼び出される ・総称関数の振る舞いは実行時に選択されるメソッドの 組み合わせによって決まる multi-methodsとは? 実行されるメソッドは引数となっているすべてのクラ スに基づいて選択される C++でmulti-methodsのようなことをやろうとした場合は 複雑な手段を用いなければならない →C++ではメソッド選択に影響するのは第1引数のみ ・CLOSではメソッド選択に使われる引数に関しても クラス優先度が影響する ・型の評価を動的に行うため、適用可能なメソッドが 未定義である危険性がある CLOSではこれを解決するために二つの方法をとっている 1 適用可能なメソッドが存在しないときに選択される メソッドを用意する →no-applicable-method しかしそのデフォルトの振舞いは警告、あるいはエラー 2 no-applicable-methodをカスタマイズする no-applicable-methodのデフォルトの引数はすべてクラスtである →no-applicable-methodも総称関数 ・C++ではメソッドはクラスのメンバである →メソッドはクラスのメッセージのやりとりをする "message-passing syntax" C++のメソッド選択はメンバ関数がvirtualかnon-virtualかで異なる non-virtualのとき・・・関数のオーバーロード 実行されるメソッドはコンパイル時に第1引数に従って選択される 実行時にかかるコストが少ない virtualのとき 実行時に選択 ただし、必ずいずれかのメソッドかvirtual functionに適用可能で なければならない メソッド選択に使われる引数は一つだけ →第1引数以外のすべての引数の型と引数の数が関数定義と 一致しなければならない しかしCLOSと異なり効率的で単純 7.5 Method Combination CLOSの総称関数 1 引数に従ってメソッドを選択 2 メソッドの優先度によって順序を決める 3 メソッド結合 総称関数が呼ばれると、決められた枠組みに従って メソッドを組み合わせる この組み合わせはprimary methodとauxiliary method(before method, after method,around method)による C++にはCLOSのようなメソッド結合の仕組みは存在しない 7.6 Encapsulation CLOSにはC++のような強制的な情報隠蔽の手段は存在しない →名前を把握できるすべてのエントリは読み書き、制御が可能という Lispの考え方を共有 C++ではカプセル化の手段に富んでいる 1 クラスによるカプセル化 2 クラス継承においてもカプセル化 フレンド関数 7.7 System Evolution and Customization C++にはCLOSのような動的なカスタマイズの機構は存在しない →C++のクラスはfirst-classではない しかしC++にもシステムがあらかじめ定義した振舞いを変更する 道が残されている 1 演算子のオーバーロード 2 クラスのコンストラクタ、デストラクタ