0

我想检查对象是否有一个 DisplayObject 作为它的祖先之一,如果有,则对其执行一些操作。有什么快速简单的方法来做到这一点?

4

2 回答 2

3

如果“祖先”是指“超类之一”,那么解决方案很简单:在 ActionScript中,只有当对象的类在其继承链中具有 DisplayObject 时,对象才能具有“作为其祖先之一的 DisplayObject ”,这很容易通过以下方式检查铸件。继承在父类和子类之间创建“IS A”关系,因此子类的实例是父类(以及任何其他远亲)的实例。

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.getQualifiedClassNameflash.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函数。这将生成对象的 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.

于 2011-07-03T11:06:49.127 回答