AS3でクラスの継承やインターフェイスを調べる
AS3 で、あるクラスが特定のクラスやインターフェイスを継承してるか?(インプリメンツしてるか?)を調べるメモ。 インスタンスに対してなら、 is を使えば良いから簡単。
var mc:MovieClip = new MovieClip();
trace(mc is MovieClip); // <- true
trace(mc is Sprite); // <- true
が、これがクラスになると使えない。
trace(MovieClip is MovieClip); // <- false
trace(MovieClip is Sprite); // <- false
trace(MovieClip is Class); // <- true
で、調べてみると flash.utils に describeType な関数が用意されていて、 コレを使うとクラスやオブジェクトのメタ情報?がXMLで取れる。
// Spriteをリフレクション
trace(describeType(Sprite));
とかすると、色んな情報が吐き出されてくる。
<type name="flash.display::Sprite" base="Class" isDynamic="true" isFinal="true" isStatic="true">
<extendsClass type="Class"/>
<extendsClass type="Object"/>
<accessor name="prototype" access="readonly" type="*" declaredBy="Class"/>
<factory type="flash.display::Sprite">
<extendsClass type="flash.display::DisplayObjectContainer"/>
<extendsClass type="flash.display::InteractiveObject"/>
<extendsClass type="flash.display::DisplayObject"/>
<extendsClass type="flash.events::EventDispatcher"/>
<extendsClass type="Object"/>
<implementsInterface type="flash.display::IBitmapDrawable"/>
<implementsInterface type="flash.events::IEventDispatcher"/>
(省略...)
</factory>
</type>
で、この中の extendsClass ってのと implementsInterface ってのを見てみると、 継承してるクラスとかインターフェイスがちゃんと出てきてる。 これを比較してやれば判別出来そう。 パッケージ名を補完するのには flash.utils に getQualifiedClassName な関数が用意されてるよ。 使い方が合ってるかは分からんですけど。
var check:String = getQualifiedClassName(Sprite);
var meta:XML = describeType(MovieClip);
for each (var s:String in meta.factory.extendsClass.@type)
{
if (s == check)
{
trace("hit", s); // 'hit flash.display::Sprite'って出るハズ
}
}
これを Boolean を返すような関数とかメソッドにしとくと、 先祖クラスのチェックに使えるね。インターフェイスのチェックなら、
var check:String = getQualifiedClassName(IEventDispatcher);
var meta:XML = describeType(MovieClip);
for each (var s:String in meta.factory.implementsInterface.@type)
{
if (s == check)
{
trace("hit", s); // 'hit flash.events.IEventDispatcher'って出るハズ
}
}
こんな感じでチェック出来るね。
他にも色々な情報が引き出せてるから、 かなり細かいところまでチェックしたり出来そう。 リフレクションのライブラリとかって、コレを使ってるんだろうなぁ。と勝手に憶測。
また一つ勉強になりましたとさ ![]()
- Posted at:
- 2008/03/18 02:45:00
- 0 Comments
- 0 TrackBacks
- Tags:
- ActionScript
- Flash
- Trackback:
- http://humming.via-kitchen.com/2008/03/18/check-class-extends-and-implements/trackback/
TrackBacks
まだ登録されていません。
Comments
まだ登録されていません。