0

Java、C++ などの言語では、たとえば、toInt()コードを言語機能によって所定のプリミティブ型に適切に変換できるようにする関数を提供する機能があります。(この例では、Int.)

つまりmyObject()、標準のキャスト関数toInt()が宣言されている場合、 like の呼び出しは機能しInt(myObject)ます。これは、キャストを完全に忘れて何かをやりたいだけの状況にはるかに関連しています-...someVar:Int = myObject + 3任意の例です。

私はAS3のドキュメントを検索し、それ以外で検索を行いましたが、AS3で簡単にアクセスできる機能、インターフェース、またはその他のようなもののセットはないようです。誰かそんなこと知ってる?このようなキャスト機能をサポートする言語では必須の知識のように思えますがmyObject.toInt()、数学的な作業の最中のように、部分的に修飾された名前を書くという冗長さに頭が下がります。

4

1 に答える 1

2

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() を呼び出すかどうかは、演算子への他の引数の型に依存しているようです。

于 2013-12-23T21:16:46.447 に答える