2010-03-25 81 views
9

有了这个代码AS3 - 我可以知道一个类是否实现了一个接口(或者是另一个类的子类)?

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

即与IEventDispatcher接口比较classParam

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操作的方法吗?

回答

6

我看不出有任何的方式来实现你想除非使用describeType做什么。
它是为此目的而创建的,为什么你不想使用它?

编辑:
它实际上只需要2行做到这一点:

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

...或者只是一个,如果它是什么困扰你:

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

困扰我的是'describeType'的速度。不是很慢吗? – 2010-03-25 23:13:51

+0

这取决于你使用它的程度,但是,这很慢。问题是我不认为有另一种方法来实现这一点。本文可能会让你感兴趣,作者做了一个基准,并发现UIComponent上的describeType在他的计算机上需要5ms:http://faindu.wordpress.com/2010/02/01/actionscript-flex-dependency-injection-performance/ – 2010-03-26 09:02:24

+0

因此创建对象需要更少的时间?我将运行一个基准来看看它。 – 2010-03-26 13:11:27

0

添加到“捷思锐-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倍。

相关问题