在actionscript3.0中,如何判断一个Class对象是代表一个类还是一个接口



我正在尝试开发一种方法,在actionscript中以class对象为参数,并在运行时生成该类的实例:

public function getComponent(componentType:Class):Object
{
    return new componentType();
}
在某些情况下,传递给我的可能是一个代表接口的Class对象。当然,我不能直接创建接口的实例。

是否有一些方法来查询类对象,并确定它是否代表一个接口,以便我可以避免尝试以这种方式创建一个实例?

假设您遵循接口类的命名约定,如在标准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();
}

您不必设置name变量,但这有助于使搜索更严格一些。你可以这样做:

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" );
}

经过仔细的尝试和错误,我想出了以下函数:

public static function isInterface(clazz:Class):Boolean
{
    return describeType(clazz).factory.extendsClass.(@type=="Object").length()==0;
}

有谁知道这个条件是否总是适用于所有actionscript接口?

我想这对你会有用的:

getQualifiedSuperclassName(classObject);

如果传递一个接口,这将返回null,因为接口没有父类。它总是会给你任何类型的类的结果,因为每个类基本上都是一个对象:)

无论如何,我不认为传递这样的混合值函数是一个好主意;)检查课程是否以"I"开头更糟糕(对不起,Bennett:))

注。记住,描述类型是非常慢的!

相关内容

  • 没有找到相关文章

最新更新