0

オブジェクトの祖先の1つとしてDisplayObjectがあるかどうかを確認し、ある場合はいくつかの操作を実行したいと思います。これを行うための迅速で簡単な方法はありますか?

4

2 に答える 2

3

「祖先」が「スーパークラスの1つ」を意味する場合、解決策は単純です。ActionScriptでは、オブジェクトのクラスの継承チェーンにDisplayObjectが含まれている場合にのみ、オブジェクトは「祖先の1つとしてDisplayObject 」を持つことができます。鋳造。継承は、親クラスと子クラスの間に「ISA」関係を作成するため、子のインスタンスは親(および他の遠い祖先)のインスタンスです。

var object:* = ....;
if (object is DisplayObject) {
    var displayObject:DisplayObject = object as DisplayObject;
    // object has DisplayObject class in it's inheritance chain
    // do something with object using displayObject reference
} 

また

var object:* = ....;
var displayObject:DisplayObject = object as DisplayObject;
if (displayObject != null) {
    // object has DisplayObject class in it's inheritance chain
    // do something with object using displayObject reference
} 
于 2011-07-03T11:47:47.067 に答える
2

質問の誤解による完全な書き直し

編集私の最初の提案よりも速い方法は、ドキュメントで提案されているようにflash.utils.getQualifiedClassNameとの組み合わせを使用flash.utils.getQualifiedSuperclassNameして、各祖先クラスのスーパークラスをチェックすることです。これがあなたのためにそれをする簡単な関数です:

function containsAncestor($obj:*,$className:String):Boolean {
    var qn:String = getQualifiedClassName($obj);
    while(qn != "Object") {
        if(qn == $className) return true;
        qn = getQualifiedSuperclassName(getDefinitionByName(qn));
    }
    return false;
}

//////////////////////////////////
//usage example:
//////////////////////////////////
var mc:MovieClip = new MovieClip();
trace(containsAncestor(mc,"flash.display::DisplayObject"));  //true
trace(containsAncestor(mc,"flash.display::BitmapData"));  //false

必要なのは、flash.utilsのdescribeType関数です。これにより、Objectに戻る祖先クラスの完全なリストを含むオブジェクトのXML表現が生成されます。MovieClipの出力の始まりは次のようになります。

<type name="flash.display::MovieClip" base="flash.display::Sprite" isDynamic="true" isFinal="false" isStatic="false">
    <extendsClass 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"/>

したがって、残っているのは、extendsClassノードをループして、の存在を確認することだけですDisplayObject

于 2011-07-03T11:06:49.127 に答える