コンストラクタ
オブジェクトのデータ領域の初期値を設定するメソッドは、一般にコンストラクタ(Constructor)と呼ばれています。MopsではClassInit:がそれに当たります。このメソッドが特殊なのは、各オブジェクトが生成されるときに自動的に起動されるため、プログラマが明示的にメッセージを送る必要がないという点です。そのクラスに属する全てのオブジェクトに一律に送られます。この特殊性により、ClassInit:は、一般に引数をとることはできません。
静的オブジェクトの場合には、ライブラリ関数(
システムコール)をClassInit:メソッドから行うことはできません(konstは問題ありません。)。したがって、一般に、ClassInit:は、システム関数コールを含むことはできません。
インスタンス変数としてヒープ領域を確保してそのポインタやハンドルを取るような場合には、そのためにシステム関数を呼ぶ必要がありますが、その意味に応じてInit:メソッドやNew:メソッドを定義定義し、そこからシステム関数を呼んでおき、ランタイムに必要になった時点で明示的にメッセージを送って初期化すべきです。
ClassInit:メソッドは、各
インスタンス変数についても、そのクラス自身に付いても、最上位クラスから順に重畳的に実施されます。基本的なデータクラスにはClassInit:メソッドが既に定義されていますから、その組み合わせが、ほぼデフォルトのコンストラクタになります。普通、数値を格納する変数オブジェクトは"0"、ポインタクラス"Ptr"では"nilP"、ハンドルクラス"Handle"では"nilH"という具合です。
補:iMopsでは、ハンドルが廃止されたので、nilHは定義されていません。また、無効ポインターとしては0を用いるのが原則となったようなので、nilPは定義されてはいますが、ポインタークラスの初期値は0です。
自らクラスを定義して、そのクラスのインスタンスに特別な初期値を与えたいときには、目的に適うようClassInit:メソッドを定義します。この定義は、上位クラスメソッドのオーバーライドにはならず、追加的に実行されます。
Mopsのソースコードには、ClassInit:メソッド定義の中に、"ClassInit: super"と書かれているものがありますが、これは、かつて、上位クラスのメソッドがオーバーライドされていた頃の名残で、いまでは無駄なものだそうです。
デストラクタ
コンストラクタの反対はデストラクタで、もう使わなくなったオブジェクトデータを廃棄して初期値に戻すものです。これはMopsではRELEASE:メソッドが標準です。ですが、RELEASE:は、ごく普通のメソッドの一つでしかありません。自動的に送られることもありませんし、各
インスタンス変数に自動的に送られることもありませんし、上位クラスのRELEASE:を重畳的に呼ぶこともありません。
静的オブジェクトでは、プログラムの実行途中でRELEASE:する必要がない場合も多いでしょう。ただ、ヒープメモリ(プログラムが動的に自由に利用できるメモリー)に領域を確保して、そのポインタないしハンドルをとってオブジェクト内に格納している場合、そのオブジェクトのデータをもう利用しないような時には、少なくとも、そのポインタやハンドルに対してはRELEASE:を送ってメモリー領域を解放しておく意味はあります。
動的オブジェクトとして用いる場合にも備えて、
クラスを定義するときは、少なくともヒープを用いる
インスタンス変数に対してはRELEASE:を送るようなRELEASE:メソッドを定義しておくべきでしょう。
関連項目:
最終更新:2020年01月23日 23:32