我是ActionScripting的新手,但我做了一些Java。我被告知他们有点相似。我正在编写我的swf文件,并集成了一些AS3。
function init():void{
// do something
}
function init(var string:String):String{
// do something else
}
AS不允许这样做吗?如果没有,除此之外还有另一种处理方法吗?
提前致谢。
答案 0 :(得分:5)
是的,您可以覆盖功能。但是你给出的例子并不是压倒性的 - 它正在超载。对于覆盖函数,您基本上只需创建一个具有相同签名的函数和子类中的所有内容,并在其前面添加“覆盖”一词。
但是你不能直接重载一个函数。如果需要可变数量的参数,则必须使用可选参数。像这样:
function init(str:String = null):String
{
if (str == null)
{
// do one thing
return null;
}
else
{
// do another thing
return "someString";
}
}
这就是你在AS3中能做的最好的事情。至少严格来说,无法超载功能是一种相当普遍的抱怨和明显的语言缺陷。
答案 1 :(得分:1)
你的意思是方法重载?遗憾的是,Actionscript不支持这一点。
要解决此问题,您可以使用默认参数,或者只是减少参数约束。 This answer有一些细节。
你可以试试这个:
function init(var string:String = "Default value"):String{
// do something
}
答案 2 :(得分:1)
Actionscript不支持方法重载。但是,根据the answer到this question,您还有其他选择。
如果您只想接受任何类型,可以使用
*
允许任何类型:function someFunction( xx:*, yy:*, flag:Boolean = true ) { if (xx is Number) { ...do stuff... } else if (xx is String) { ...do stuff... } else { ...do stuff... } }
如果订单中有大量各种参数 不重要,使用选项对象:
function someFunction( options:Object ) { if (options.foo) doFoo(); if (options.bar) doBar(); baz = options.baz || 15; ...etc... }
如果您有可变数量的参数,则可以使用
...
(rest) parameter:function someFunction( ... args) { switch (args.length) { case 2: arr = args[0]; someBool = args[1]; xx = arr[0]; yy = arr[1]; break; case 3: xx = args[0]; yy = args[1]; someBool = args[2]; break; default: throw ...whatever... } ...do more stuff... }
对于需要调用常用函数的情况 在类中,您应该指定每个类共有的接口:
function foo( bar:IBazable, flag:Boolean ) { ...do stuff... baz = bar.baz() ...do more stuff... }