AS3 - 我能知道一个类是否实现了一个接口(或是另一个类的子类)吗?

9

使用这段代码

function someFunction(classParam:Class):Boolean
{
    // how to know if classParam implements some interface?
}

即,将classParamIEventDispatcher接口进行比较:

someFunction(EventDispatcher) // returns true
someFunction(Object) // returns false

我知道不能使用is运算符来实现。但是,有没有其他方法可以做到呢?有没有办法知道一个类是否实现了某个接口?(或者是另一个类的子类?)
可能的解决方法:
A. 创建一个classParam的对象,并使用该对象使用is运算符进行比较。
function someFunction(classParam:Class):Boolean
{
    return (new classParam()) is IEventDispatcher
}

B. 使用describeType()

function someFunction(classParam:Class):Boolean
{
    var xml:XML = describeType(classParam)
    // found "implementsInterface" value in xml and compare to IEventDispatcher
}

有一种方法可以不使用describeType或创建new操作符吗?

4个回答

6

我认为除了使用describeType方法之外,没有其他办法来实现您要做的事情。
这个方法就是为此而创建的,为什么您不想使用它呢?

编辑提示:
实际上只需要两行代码就可以完成此操作:

var classDescription:XML = describeType(classParam);
return (classDescription.factory.implementsInterface.(@type == getQualifiedClassName(IEventDispatcher)).length() != 0);

如果您只想在一个地方查看,这里有一个简单的方法:

return (describeType(classParam).factory.implementsInterface.(@type == getQualifiedClassName(IEventDispatcher)).length() != 0);

让我困扰的是describeType的速度。它不是很慢吗? - Lucas Gabriel Sánchez
这取决于你使用它的频率,但是是的,它非常慢。问题在于我认为没有其他方法可以实现这一点。这篇文章可能会引起你的兴趣,作者进行了基准测试,并发现在他的计算机上对UIComponent进行describeType需要5毫秒:http://faindu.wordpress.com/2010/02/01/actionscript-flex-dependency-injection-performance/ - Zed-K
那么创建对象会更快吗?我会对此进行基准测试以查看结果。 - Lucas Gabriel Sánchez
1
这是基准测试:http://dl.dropbox.com/u/2283327/stackoverflow/describeTypeBenchmark/describeTypeBenchmark.html - Lucas Gabriel Sánchez
谢谢你的基准测试,结果非常有趣。这证明describeType确实非常慢 =/ - Zed-K

1

0

补充 'Zed-K' 的回答。最终我并不需要 .factory 部分。这里有一个测试的例子,检查类是否使用了接口。'_instance' 是被测试的类。

[Test]
public function testInstanceShouldBeIUser():void
{
    var classDescription:XML = describeType( _instance );
    var type:String = getQualifiedClassName(IUser);
    var xmlList:XMLList = classDescription.implementsInterface.(@type == type);
    assertTrue("expected IUser", xmlList.length() != 0 );
}

0

可能不需要。顺便提一下,还有 describeTypeJSON,比 describeType 快大约 5 倍。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接