在Java,C ++等语言中,有能力提供例如toInt()
函数,以允许您的代码通过语言功能巧妙地转换为给定的基本类型。 (在此示例中,为Int
。)
也就是说,如果您声明了标准转换函数myObject()
toInt()
,那么Int(myObject)
之类的调用就可以了。这与你只是想完全忘记演员阵容并完成某些事情的情况更为相关 - someVar:Int = myObject + 3
......对于一个任意的例子。
我搜索过AS3文档并在外面进行了一些搜索,但似乎在AS3中没有这样的功能,接口或其他类似的东西可以轻松访问。有谁知道这样的事情?它似乎是支持这种演员特征的任何语言的基本知识,而且我最终还是在数学工作中编写了一个像myObject.toInt()
这样的部分限定名称的冗长。
答案 0 :(得分:2)
这是一种常见的误解,即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
布尔解释很有意思,但任何非null的Object(或String)都是正确的,所以实际上它可以解决。运行时调用valueOf()或toString()是否依赖于运算符的其他参数的类型。