一个常见的误解是 AS3 中的运算符重载是不可能的。它不是,但它不是完全常见的做法,它不像其他语言那样工作。
AS3 是“渐进式”的。这意味着您可以在需要时指定类型,而不必指定类型,并且在对两种不同类型执行操作时,它会以合乎逻辑的方式为您推断/转换。
对于对象,AS3 提供了valueOf():Object
和toString():String
函数,允许您定义铸造的自动处理。前者提供“对象的原始值”,而后者定义“对象的字符串表示”。
两者的默认值都是字符串“[object ClassName]”,但您可以覆盖此默认值。这是一个例子:
package
{
import flash.display.Sprite;
import flash.utils.getQualifiedClassName;
public class Main extends Sprite
{
public function Main():void
{
trace("-----------------------------");
var foo = new MyClass();
trace("foo is: ");
trace(foo);
trace("foo+foo is:");
trace(foo+foo);
trace("foo+foo+'--' is:");
trace(foo+foo+"--");
trace("'--'+foo+foo is:");
trace("--"+foo+foo);
trace("Math.PI/foo:");
trace(Math.PI/foo);
trace("'5'+foo is:");
trace('5'+foo);
trace("false || foo is:");
trace((false || foo));
trace("foo | 0xC is:");
trace(foo | 0xC);
trace("typeof(foo) is:");
trace(typeof(foo));
trace("getQualifiedClassName(foo) is:");
trace(getQualifiedClassName(foo));
}
}
}
class MyClass {
public function valueOf():Object { return 3; }
public function toString():String { return "three"; }
}
跟踪输出是:
-----------------------------
foo is:
three
foo+foo is:
6
foo+foo+'--' is:
6--
'--'+foo+foo is:
--threethree
Math.PI/foo:
1.0471975511965976
'5'+foo is:
5three
false || foo is:
three
foo | 0xC is:
15
typeof(foo) is:
object
getQualifiedClassName(foo) is:
Main.as$30::MyClass
布尔解释很有趣,但任何非空对象(或字符串)都是真的,所以实际上它是可行的。运行时是否调用 valueOf() 或 toString() 似乎取决于运算符的其他参数的类型。