在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中保留
答案 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
找出任何给定类型扩展的所有类,以及许多其他有趣的东西。
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
时,您知道没有更多的祖先需要检查。