パブリックインスタンス変数へのメッセージ

パブリックインスタンス変数(以下、PubIvarと略記)の一般的な話は、前に書きました。ここでは、特殊な状況下でのPubIvarへのメッセージ送信方法について述べます。念のため、普通の場合のPubIvarへのメッセージ送信方法を書いておくと、
AClass AnObject \ AnObjectは、Varクラスのパブリックインスタンス変数Var1を持つとする。

5 put: ivar> Var1 in AnObject
これで、AnObjectのパブリックインスタンス変数"Var1"には‘5’が格納されます。

オブジェクトに名前がある場合はこれでいいんですが、名前の無いオブジェクトがあります。例えば、"ObjHandle"クラスを使ってヒープ上に生成したオブジェクトのような場合です。個人的にはHandleListやPtrListのサブクラスを使って結構やります。この無名オブジェクトがパブリックインスタンス変数を持っていたとき、それにメッセージを送るにはどうすれば良いでしょうか。つまり、上の構文で、"in"の後に書くものが無いわけです。

こういう場合も、実は方法があります。ここでのオブジェクト名は、ベースアドレスとクラスデータの取得が重要なようで、普通のオブジェクトへのメッセージバインドの場合と同じように使われているようなのです。ObjHandleを使えば構文は次のようになります。
ObjHandle myObj

' AClass NewObj: myObj
5 obj: myObj put: ivar> Var1 in class_as> AClass

やや、裏技感があるので、わかりにくいですね。じーっとみればわかることなんですが、要は、"put: ivar> Var1 in"が一塊で、"AnObject"へのメッセージになっているんですね。この部分を、"メッセージ:"と置き換えてみると、初めのものと、無名オブジェクトの場合とは、次のように書き変わります。
5 メッセージ: AnObject
5 obj: myObj メッセージ: class_as> AnClass
これでわかったと思いますが、これは、Mopsでの早期メッセージバインドの基本形二つです。ですから、意味はありませんが、当然、
5 AnObject put: ivar> Var1 in class_as> AClass
でも有効なわけです。

但し、Late Bindはできません。まあ、必要ないとは思いますが。

一般型としてシンボリックに書けば、
[パラメタ] [オブジェクトベース] [メッセージ:] ivar> [PubIvar名] in class_as> [クラス名]
という語順になります。


関連事項:






最終更新:2019年06月04日 21:44