我不确定我是否遗漏了一些东西。我想比较两个使用相同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的值隐式强制转换为不相关的类型。
答案 0 :(得分:4)
注意类和对象的概念之间的差异。前者是数据类型,而后者是它的运行时实例,即变量。 is
运算符无法将一个变量与另一个变量进行比较。
是运营商
评估对象是否与特定的数据类型兼容, 类或接口。使用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会抱怨,这就是我使用动态属性访问的原因。