使用“is”比较两个接口

时间:2011-10-07 07:56:45

标签: actionscript-3 interface comparison flash-builder

我不确定我是否遗漏了一些东西。我想比较两个使用相同interface的类。这可能吗?我知道is运算符比较了类,但在使用接口时是否有类似的功能?

// works
var effect1 : CrazyEffect = new CrazyEffect();
var effect2 : SaneEffect = new SaneEffect();

trace(effect1 is effect2) // false

// does not work
var effect1 : ISoundEffect = new CrazyEffect();
var effect2 : ISoundEffect = new SaneEffect();

trace(effect1 is effect2)

1067:将类型为ISoundEffect的值隐式强制转换为不相关的类型。

2 个答案:

答案 0 :(得分:4)

注意类和对象的概念之间的差异。前者是数据类型,而后者是它的运行时实例,即变量。 is 运算符无法将一个变量与另一个变量进行比较。

根据language reference

  

运营商

     

评估对象是否与特定的数据类型兼容,   类或接口。使用is运算符而不是instanceof   类型比较的运算符。您也可以使用is运算符   检查对象是否实现了接口。

换句话说,编译器期望第一个操作数是变量,而第二个操作数应该是类型标识符

var sample:String = "Object is an instance of a class.";
     ^^^    ^^^
variable    type identifier  

但是effect2不是类型标识符,而是变量。因此错误信息。

不幸的是,没有通用的运算符来测试接口的通用性。唯一的选择是:

trace((s is ISoundEffect) && (t is ISoundEffect));

更新

检查对象是否是同一个类的实例可以通过比较类名来完成:

if (getQualifiedClassName(effect1) == getQualifiedClassName(effect2)) {
   // true
}

有关深入讨论,请参阅Get the class used to create an object instance in AS3

答案 1 :(得分:1)

即使它可以使用getQualifiedClassName,还有一个更好的方法来检查两个对象是否是同一个类的实例:

a['constructor'] === b['constructor']

getQualifiedClassName非常慢且占用大量CPU资源。由于上面的代码只是比较属性值,因此它很快。是的,constructor是每个对象的属性,但如果您尝试使用点符号访问它,FB会抱怨,这就是我使用动态属性访问的原因。