Langphilia! / KL1 / Tips / OOP
KL1はオブジェクト指向言語ではありませんが、 プロセスとストリームを多用するプログラミング・スタイルは、 オブジェクト指向プログラミングのオブジェクトと 非同期メッセージ渡しに相当します。 [KLIC講習会テキスト 1.2.2]
KL1のプロセスはオブジェクトです。 多くのオブジェクトはメッセージを受け取って状態遷移しますが、これは メッセージを受け取って状態遷移するサーバ・プロセスとして表現できます。
プロセスを定義する述語はクラス定義です。 プロセスへの入口の述語はコンストラクタです。 他のプロセスからメッセージを受け取るには、 メッセージ(ストリーム)を述語の引数として受け取る必要があります。
すなわち、KLICでは{生成木で親子関係にないプロセス}から メッセージを受け取ることができません。 PIMOSではOSがストリームを管理しており、 システム内のストリームを取得することができました。 分散KL1でも、ストリームのネーミング・サービスが検討されています。
クラスのインスタンスを作るには、コンストラクタを呼び出します。 すると自動的にメモリが割り当てられ、プロセスがゴール・プールに入れられます。 プロセスが死ぬと、ゴミ集めによって自動的にメモリが解放されます。 コンストラクトとデストラクトは自分でやりましょう。
KL1には継承の概念はありません。 全てのプロセスはfinalクラスです。 従って、総称/集約 (aggregation) のための抽象クラスを直接 表現することはできません。 オーバライドの心配がないので基底クラスも拡張も気楽に書けます。
クラスを拡張するには、拡張部分を自分で持ち、 それ以外は元のクラスに委任 (delegation) します。 継承はできませんが、隠蔽はできます。
プロセスにメッセージを渡すことによって望みの反応を引き出します。 サーバ・プロセスに対してはストリームにメッセージを流すことによって、 サーバ・プロセス内の述語呼び出しを引き起こします。
クラス・メソッドはインスタンスを作らずに呼び出せる、普通の述語です。 クラスとの関連を強調したければ、クラス名を関した述語名を付けるなどの 名付け規約に従えば良いでしょう。
KL1にはグローバル変数がないので、 オブジェクトの属性は述語の引数として持ち回る必要があります。