![]() |
[1999 年 4 月号] |
[Happy Squeaking!!]
3.Squeak演習:イントロスペクション
3.3 オブジェクトの状態を調べる
オブジェクトの属性にアクセスする
今度は生成されたインスタンスの状態を調べてみることにします。
インスタンスの属性の値を見ることができれば、インスタンスがどのような状態であるかがわかります。
以下を"print it"してみましょう。
OrderedCollection instVarNames => ('array' 'firstIndex' 'lastIndex' )
OrderedCollectionには、'array'、'firstIndex'、'lastIndex'の三つの変数が属性として順番に定義されていることがわかります。
これを踏まえた上で、次のコードの結果を見てみます。
| ord | ord := OrderedCollection new. ord add: 'a'; add:'b'; add:'c'. ord instVarAt: 1. => (nil nil 'a' 'b' 'c' nil nil nil nil nil )
何が返ってきたか想像できるでしょうか。instVar:1によってインスタンスの持つ変数の一番目の値を指定しています。つまりOrderedCollectionインスタンスが'array'変数の中に保持している属性値が取り出されたのです。
Squeakの場合は、名前指定によるインスタンス変数へのアクセスもできます。ord instVarAt:1を以下のように書き換えて実行してみてください。
ord instVarNamed: 'firstIndex'. "変数の名前を指定して値を取り出す" => 3
これらのメッセージはおなじみのインスペクタで使われています。インスペクタがあらゆるオブジェクトの内部を覗けるのは、実はここで挙げたイントロスペクト用のメッセージを使っていたからなのです。
インスペクタを開くと同様の結果が確認できます。
OrderedCollectionのインスペクト
これは一種の「カプセル化」破りです。本来、インスタンス内部に保持されている変数は、変数アクセス用のメソッドをそのクラスに定義しない限り、アクセスすることは許されません。しかし、instVarAt: を使えば、アクセス用のメソッドがなくても値が取り出せ、かつ(後でやりますが)変更も可能です。これらのメッセージは、非常に強力ですが、使い方を誤ると、オブジェクト指向をくずすことになるので注意が必要です。 |
© 1999-2001 OGIS-RI Co., Ltd. |
|