Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 如何确定一个类';运行时的超类是什么?_Actionscript 3_Class - Fatal编程技术网

Actionscript 3 如何确定一个类';运行时的超类是什么?

Actionscript 3 如何确定一个类';运行时的超类是什么?,actionscript-3,class,Actionscript 3,Class,在ActionScript3中,如果给我一个类对象,有没有办法确定该类是否从另一个给定的类扩展而来?不过,我不想实例化这个类来用is关键字检查它 更具体地说,我正在尝试使此功能正常工作: public function validateClass(classObj:Class):EngineObject{ if(classObj extends EngineObject){ return new classObj(); } else { throw

在ActionScript3中,如果给我一个类对象,有没有办法确定该类是否从另一个给定的类扩展而来?不过,我不想实例化这个类来用
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!");
    }
}

编辑:忘记了
中的
是AS3中保留的
请查看
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);
}

您可以使用
describeType
来计算任何给定类型所扩展的所有类,以及许多其他有趣的内容

describeType
返回一个XML,其中包含您想知道的关于类的几乎所有信息。您只需循环遍历所有名为
extendClass
的元素,并将它们的属性
type
与您选择的类名进行比较。要计算类名,只需对要比较的类型使用
getQualifiedClassName

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
时,您知道没有更多的祖先要检查。

首先,
中的
是一个保留字,您不能将其用作变量。我对这个用例感兴趣。从答案来看,这似乎是可以做到的,但你在寻找什么是不能用接口做到的?我的答案应该检查每个祖先,直到对象,但它并没有在同时构建和测试一个完整的解决方案时进行测试;-)使用递归而不是while循环对性能有什么好处吗?@shanetheat说实话,我不知道;-)这更像是一种编程风格。也许你的解决方案比我的好/快,但不能这么说。老实说,除非我们开始处理数百层的继承,否则我怀疑这会有多大区别。当我看到事情做得不同时,我总是很好奇,以防我需要学习新东西:)