Haxeメモgetter/setterとReflection

たまには技術エントリー。最近はキータとか流行ってるらしいですね。

HaxeでTween処理を行いたい場合、AS/JSと同様にオブジェクトの任意のプロパティにアクセスします。
たとえばAS/JSで以下のような処理を行うとすると、
var sp:Sprite=new Sprite();
sp['x'] = 20;
Haxeだとこうなります。
var sp:Sprite=new Sprite();
Reflect.setProperty(sp,'x',20);
HaxeではAS/JSの様に気安くプロパティに触らせてくれないので、Reflectクラスを使います。 Reflect.setProperty()を使った処理では、対象オブジェクトのプロパティがgetter/setterで定義されていた場合も、実装者の意図に沿った処理が走ります。
この場合、内部的に
function set x(v:Number):void
を実行してくれます。
Spriteは、flashのビルトインクラス(flash.diplay.Sprite)なので当然といった感じがしますが、Haxeで書かれたクラスに関しても同様にset_x/get_xがcallされます。
@:isVar public var x(get, set):Float;
public function get_x()
public function set_x(i:Float)
これでいい感じのTweenエンジンが作れますね。

ここで注意が必要なのが、よく似た機能を提供する Reflect.setField() というmethodです。
こちらはgetter/setterを利用してくれません。特にJSの場合だとシレっと'x'プロパティを追加したりします。このmethodの使い方はObjectクラスのパラメータを操作するのが多分ベターかと。実はこれを一番言いたかったんだけど、最後になってしまった。

Trackback

http://memo.kappa-lab.com/mt-tb.cgi/348

Leave your comment :

(いままで、ここでコメントしたことがないときは、コメントを表示する前に承認が必要になることがあります。そのときはしばらくお待ちください。)




RSS + Contuct

  • rss
  • email

Credit

Copyright (C) 2007 kappa-lab.com.
All Rights Reserved.