AS3 での演算子のオーバーロードは不可能だというのはよくある誤解です。そうではありませんが、完全に一般的な方法ではなく、他の言語のようには機能しません。
AS3 は「段階的に型付け」されます。これは、必要なときにタイプを指定できることを意味し、2 つの異なるタイプに対して操作を実行するときに、論理的な方法で推論/キャストします。
オブジェクトの場合、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
ブール解釈は興味深いものですが、null 以外のオブジェクト (または文字列) はすべて true であるため、実際にはうまくいきます。ランタイムが valueOf() または toString() を呼び出すかどうかは、演算子への他の引数の型に依存しているようです。