Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 AS3-我能知道一个类是否实现了一个接口(或者是另一个类的子类)?_Actionscript 3_Oop_Class - Fatal编程技术网

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