Простой способ получить список классов-предков для объекта в Action Script 3? - PullRequest
0 голосов
/ 03 июля 2011

Я хотел бы проверить, имеет ли объект DisplayObject в качестве одного из его предков, и выполнить некоторые операции с ним, если он имеет. Какой-нибудь быстрый и простой способ сделать это?

Ответы [ 2 ]

3 голосов
/ 03 июля 2011

Если под «предком» вы подразумеваете «один из суперклассов», то решение простое: в ActionScript объект может иметь « DisplayObject в качестве одного из своих предков », только если класс объекта имеет DisplayObject вэто цепочка наследования, которая легко проверяется путем приведения.Наследование создает отношение «IS A» между родительским и дочерним классами, поэтому дочерний экземпляр IS является экземпляром родительского (и любого другого далекого предка).

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
} 
2 голосов
/ 03 июля 2011

полное переписывание из-за неправильного понимания вопроса

Редактировать Более быстрый способ, чем мое первое предложение, состоит в использовании комбинации 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

Вам нужна функция descriptionType из flash.utils.Это создает XML-представление объекта, включая полный список классов-предков обратно в Object.Начало вывода для 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.

...