ビルトインクラスのプロパティーについて
アクセサ
どうもお久しぶりです。taroです。
今回はAS3のビルトインクラスのプロパティーに関してのお話をしようと思います。自分もリファレンスの全てを端から端まで読んだわけではないので、強いことは言えませんが、ビルトインクラスのプロパティーは大体アクセサー(setter / getterメソッド)によって実装されています。(プロパティーという用語の使用が適切かどうかは分かりませんが、ご容赦下さい。)
このような実装について、
- オブジェクト指向の情報隠蔽の考え方に基づいている
- 上にも含まれるかもしれませんが、プロパティーの読み取り・書き込み属性を設定出来る
- プロパティーの値が変化した時に処理を走らせることが出来る
ということが言えます。最後については
public function set text(value:String):void { _text = value; // do something... }
というような実装にすると、クラスの外部から見たとき、このクラスのインスタンスのtextプロパティーの値が指定される度に 何かの処理を走らせるということが出来るということです。
隠蔽された内部の処理
前述の通り、ビルトインクラスのプロパティの多くはアクセサであるため、少し予想外の挙動となってしまうことがあります。
startDrag()
ドラッグ出来る範囲をカスタマイズしたいと思ったとき、x, yのsetterメソッドをオーバーライドして、値を制限するという方法は出来ません。 というのは、startDrag()が実行された後、ユーザがオブジェクトの位置を変えてもこのsetterメソッドは動かず、 内部の変数だけが変わるからです。ソース・コードについてはリンクを辿っていただければご覧になれます。今回の話とは関係ありませんが、 ドラッグ領域を制限するには、ソース・コード75行目
startDrag(true, new Rectangle(_x, minPos, 0, maxPos - minPos));
にあるように、startDrag()の第二引数で指定することが可能です。
TextFieldのアクセサ
TextFieldに関しては本件以外にもテキストのレンダリングの問題等も関係しているので、この系列に類するのが相応しいかどうか分かりませんが、 ここで紹介することにしました。弊社hidakaのエントリテキストエリアにおさまる文字サイズを調べる にある、適切な文字サイズを自動的に計算するということを以前実装しようとしたことがありました。
その時、trace文が一個あるか無いかでコードの挙動が変わってしまうという 奇妙な現象に気づいたのがきっかけです。(おとなしく先輩のコードをコピペしていればこういう面倒なことに気づかずにすんだのに!!)その一文がtrace(tf.height)です。サンプルコードになります。ソース・コードについてはサンプルの下のテキストリンクを辿ってください。
一見無意味な39行目のコード
tf.height;
をコメントアウトすると、思い通りの結果にはならず、右側に表示させている「fontSize: tf.height: 」の tf.heightが正しくない値になっていることが分かります。
tf.height = getterメソッドを走らせていると考えれば、このコードが何かの影響を与えても何もおかしくはないのですが、 なんとも不思議な気がします。Flash Player 10のテキストエンジンの機能を使えばこういった問題も回避できるかもしれませんがまだためしておりません。 他にも以下のブログにてtextFieldのプロパティについて面白い考察が書かれています。
http://blog.flair4.jp/2009/04/as30-textfield.html
興味深い例は幾つもあると思いますが、今日はここまでにしようと思います。
それでは