使用此代码
function someFunction(classParam:Class):Boolean
{
// how to know if classParam implements some interface?
}
即。将classParam
与IEventDispatcher
界面进行比较:
someFunction(EventDispatcher) // returns true
someFunction(Object) // returns false
我知道is
运算符无法完成。但是,有没有办法做到这一点?有没有办法知道一个类是否实现了一些接口? (或者是另一个类的子类?)
可能的解决方案:
一个。创建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
运营商?
答案 0 :(得分: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);
答案 1 :(得分:1)
答案 2 :(得分: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 );
}
答案 3 :(得分:0)
可能不是。顺便说一句,还有describeTypeJSON
,女巫比describeType
快5倍。