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.utilsdescribeType な関数が用意されていて、 コレを使うとクラスやオブジェクトのメタ情報?が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.utilsgetQualifiedClassName な関数が用意されてるよ。 使い方が合ってるかは分からんですけど。

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

まだ登録されていません。

Add Comment

Add Comment