0

在 Java、C++ 等语言中,有能力提供例如一个toInt()函数,允许您的代码通过语言特性巧妙地转换为给定的原始类型。(在本例中,一个Int.)

也就是说,如果您声明myObject()了标准转换函数toInt(),那么调用 likeInt(myObject)就可以了。这与您只想完全忘记演员表并完成某事的情况更相关 - someVar:Int = myObject + 3......对于一个任意示例。

我已经搜索了 AS3 文档并在此之外进行了一些搜索,但似乎在 AS3 中没有这样的功能、接口或其他类似的东西可以轻松访问。有谁知道这样的事情?myObject.toInt()在任何支持这种铸造功能的语言中,这似乎都是必不可少的知识,而在数学工作中,我对编写部分限定名称的冗长无能为力。

4

1 回答 1

2

一个常见的误解是 AS3 中的运算符重载是不可能的。它不是,但它不是完全常见的做法,它不像其他语言那样工作。

AS3 是“渐进式”的。这意味着您可以在需要时指定类型,而不必指定类型,并且在对两种不同类型执行操作时,它会以合乎逻辑的方式为您推断/转换。

对于对象,AS3 提供了valueOf():ObjecttoString():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() 似乎取决于运算符的其他参数的类型。

于 2013-12-23T21:16:46.447 回答