我正在尝试在actionscript中开发一个方法,该方法将Class对象作为参数,并在运行时生成该类的实例:
public function getComponent(componentType:Class):Object
{
return new componentType();
}
在某些情况下,我可能会传递一个代表接口的Class对象。当然,我不能直接创建接口的实例。
有没有办法查询Class对象并确定它是否代表一个接口,以便我可以避免尝试以这种方式创建实例?
答案 0 :(得分:1)
假设您遵循接口类的命名约定,如标准IInterfaceName
,前缀为大写字母的接口名称" I"跟随大写字母和其他类名。有几种方法可以做到这一点。如果你有许多不同的接口可以作为参数传递,你可以这样做:
首先导入flash.utils.getQualifiedClassName
并在您的函数中
public function getComponent(componentType:Class):Object
{
var name:String = getQualifiedClassName( componentType ).replace(/.*\:+/g,"");
if ( name.search( /^\I[A-Z]/g ) != -1 ) {
trace( "parameter is an interface!" );
return null;
}
return new componentType();
}
您不必设置名称变量,但这有助于使搜索更加严格。你可以这样做:
if ( getQualifiedClassName( componentType ).search( /\I[A-Z]/g ) != -1 ) {
trace( "parameter is an interface!" );
return null;
}
如果您还不知道,getQualifiedClassName
将返回类名的字符串格式。正则表达式专门检查大写IInterfaceName样式字符串。
最后,如果您知道它只有一个界面,那么您可以简单地执行此操作:
if ( componentType == IMyinterface ) {
trace( "component is a IMyinterface" );
}
答案 1 :(得分:1)
经过一番仔细的试验和错误后,我发现了以下功能:
public static function isInterface(clazz:Class):Boolean
{
return describeType(clazz).factory.extendsClass.(@type=="Object").length()==0;
}
是否有人知道这种情况是否始终适用于所有actionscript接口?
答案 2 :(得分:1)
我认为这对你有用:
getQualifiedSuperclassName(classObject);
如果传递接口,则返回null,因为接口没有超类。它总会给你一个类的任何结果,因为每个类基本上都是一个对象:)
无论如何,我不认为将这样的混合值传递给函数是个好主意;)并且检查类是否以“I”开头是更糟糕的(对不起Bennett :))
P.S。 请记住,describeType非常慢!