Actionscript 3 AS3-我能知道一个类是否实现了一个接口(或者是另一个类的子类)?
使用此代码Actionscript 3 AS3-我能知道一个类是否实现了一个接口(或者是另一个类的子类)?,actionscript-3,oop,class,Actionscript 3,Oop,Class,使用此代码 function someFunction(classParam:Class):Boolean { // how to know if classParam implements some interface? } i、 e.将classParam与IEventDispatcher接口进行比较: someFunction(EventDispatcher) // returns true someFunction(Object) // returns false 我知道这不
function someFunction(classParam:Class):Boolean
{
// how to know if classParam implements some interface?
}
i、 e.将classParam
与IEventDispatcher
接口进行比较:
someFunction(EventDispatcher) // returns true
someFunction(Object) // returns false
我知道这不能用is
操作符完成。但是,有办法做到这一点吗?有没有办法知道一个类是否实现了一些接口?(或者是另一类的子类?)
可能的解决办法:
A.创建classParam
的对象,并使用is
运算符使用该对象进行比较
function someFunction(classParam:Class):Boolean
{
return (new classParam()) is IEventDispatcher
}
B.使用descripbetype()
有一种方法不使用
describeType
或创建一个新的操作符?也许本文中的代码示例会提供一个答案:除了使用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);
添加到“Zed-K”响应。我最终不需要工厂的零件。下面是一个测试示例,该测试检查类是否正在使用和接口_实例“”是被测试的类
[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 );
}
可能不会。顺便说一句,还有describeTypeJSON
,它比describeType
快5倍左右,让我烦恼的是describeType
的速度。这不是很慢吗?这取决于你用了多少,但是是的,它相当慢。问题是我不认为有其他方法可以达到这个目的。这篇文章可能会让你感兴趣,作者做了一个基准测试,发现UIComponent上的DescripteType在他的计算机上需要5毫秒:那么创建对象将花费更少的时间?我将在上面运行一个基准来查看它。这里是基准:感谢基准,结果非常有趣。这证明了DescripteType确实非常慢=/
[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 );
}