如何在运行时确定Class的超类?

时间:2011-07-13 15:01:07

标签: actionscript-3 class

在Actionscript 3中,如果我有一个Class对象,有没有办法确定该类是否从另一个给定的类扩展?我不想实例化该类以使用is关键字进行检查。

更具体地说,我正在努力使这个功能起作用:

public function validateClass(classObj:Class):EngineObject{
    if(classObj extends EngineObject){
        return new classObj();
    } else {
        throw new Error("Given class is not a subclass of EngineObject!");
    }
}

编辑:忘记了in在AS3中保留

3 个答案:

答案 0 :(得分:2)

查看flash.utils.getQualifiedSuperclassName()flash.utils.getQualifiedClassName()

您的功能可能如下所示。

import flash.utils.getQualifiedSuperclassName;
import flash.utils.getQualifiedClassName;

public function validateClass(cl:Class):EngineObject{
    if(getQualifiedSuperclassName(cl) == getQualifiedClassName(EngineObject) ){
        return new cl();
    } else {
        throw new Error("Given class is not a subclass of EngineObject!");
    }
}

但这只适用于单个迭代深度。

您可以为每个迭代步骤执行此操作,直到您处于object级别。这是一个完整的方法。

public function validateClass(cl:Class):EngineObject
{
    if ( getQualifiedSuperclassName(cl) == getQualifiedClassName(EngineObject) )
    {
        return new cl();
    }

    var sup:Class = getDefinitionByName(getQualifiedSuperclassName(cl)) as Class;
    if ( sup == null || getQualifiedSuperclassName(sup) == getQualifiedClassName(Object) )
    {
        throw new Error("Given class is not a subclass of EngineObject!");
    }

    return validateClass(sup);
}

答案 1 :(得分:1)

您可以使用describeType找出任何给定类型扩展的所有类,以及许多其他有趣的东西。

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/utils/package.html#describeType()

describeType返回一个XML,其中包含您想要了解的关于类的所有内容。您需要做的就是遍历所有名为extendsClass的元素,并将其属性type与您选择的类名进行比较。要找出类名,只需在您要比较的类型上使用getQualifiedClassName

答案 2 :(得分:1)

function validateClass($class:Class):EngineObject {
    var qn:String = getQualifiedClassName($class);
    var en:String = getQualifiedClassName(EngineObject);
    while(qn != "Object") {
        if(qn == en) return new $class();
        qn = getQualifiedSuperclassName(getDefinitionByName(qn));
    }
    throw new Error("Given class is not a subclass of EngineObject!");
}

这里的想法是获取超类的限定名称,并将其与EngineObject的限定名称进行比较。如果这不匹配,则将超类设置为新的类名,然后循环再次运行。当合格的超类名称为Object时,您知道没有更多的祖先需要检查。