Actionscript 3 如何确定一个类';运行时的超类是什么?
在ActionScript3中,如果给我一个类对象,有没有办法确定该类是否从另一个给定的类扩展而来?不过,我不想实例化这个类来用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
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说实话,我不知道;-)这更像是一种编程风格。也许你的解决方案比我的好/快,但不能这么说。老实说,除非我们开始处理数百层的继承,否则我怀疑这会有多大区别。当我看到事情做得不同时,我总是很好奇,以防我需要学习新东西:)