自動Late Bind

PowerMopsでは、バージョン5.5から利用できる機構です。68k Mopsでは少なくとも以前はデフォルトで利用できたそうです(68k Mopsの現状はわかりません。すみません。)。

オブジェクト(のアドレス)をパラメターとして渡し、それを格納した変数にメッセージを送ることができる、という機構です。自動的にLate Bind (Dynamic Bindともいう)になります。

この機構を使うためには、Value変数"implicit_late_bind?" にTRUEを格納しなければなりません(デフォルトはfalse)。こうすることで、以降はValue変数と局所変数(いわゆるLocals、named parameterを含む)に対して直接メッセージを送るコードをコンパイルすることができます。もう一度"implicit_late_bind?"をfalseにすれば、デフォルトに戻ります。デフォルトでは変数に直接メッセージを送るコードをコンパイルしようするとエラーになります。

例えば、無意味なコードですが:
true -> implicit_late_bind?
: nonsense { ^string -- }
 " hahaha" put: ^string
 get: ^string type cr
 release: ^string
;

とかやって、
string mystring
mystring noncense<ENTER>
のようにすると、"hahaha"とプリントされます。要点は、名前付きパラメターの"^string"に直接メッセージを送ってもエラーにならないというところです。自動的にLate Bindになるわけですから、いわゆるポリモーフィズムが実現できます。例えば、変数に格納されたアドレスがサブクラスのオブジェクトだった場合には、そのサブクラスのメソッドがバインドされるということです。

上では名前付きパラメターですが、通常のlocalsはもちろん、Value変数でもOKです。実行前に適当なオブジェクトのアドレスを格納しましょう。


関連項目:






最終更新:2018年12月25日 17:23