Action脚本是基于面向对象编程开发的,但为什么它不支持函数重载?
Flex是否支持重载?
如果是,请用一个真实的例子进行简要说明。
答案 0 :(得分:22)
正如您所说,Action Script不支持函数重载(因此在Flex中也不支持)。
但是这些函数可能有默认参数,例如:
public function DoSomething(a:String='', b:SomeObject=null, c:Number=0):void
DoSomething
可以通过4种不同方式调用:
DoSomething()
DoSomething('aString')
DoSomething('aString', anObject)
DoSomething('aString', anObject, 123)
这种行为可能是因为Action Script遵循ECMA Script标准。函数确实是对象的一个属性,因此,就像您不能拥有两个具有相同名称的属性一样,您不能拥有两个具有相同名称的函数。 (这只是一个假设)
以下是第13节(PDF文件的第83页)中的标准ECMA-262(ECMAScript语言规范),当您声明类似
的函数时function Identifier(arg0, arg1) {
// body
}
创建名称为Identifier
的当前变量对象的属性,其值等于如下所示的Function对象:
new Function(arg0, arg1, body)
所以,这就是你不能重载函数的原因,因为你 不能拥有同名的当前变量对象的多个属性
答案 1 :(得分:9)
值得注意的是,函数重载不是OOP习语,它是一种语言约定。 OOP语言经常有超载支持,但没有必要。
正如lk所说,你可以用它显示的结构来近似它。或者,你可以这样做:
public function overloaded(mandatory1: Type, mandatory2: Type, ...rest): *;
此函数将需要前两个参数,然后将其余参数作为数组传递,然后您可以根据需要处理它。这可能是更灵活的方法。
答案 2 :(得分:1)
还有另一种方法 - 任何参数的函数都会返回任何内容。
public function doSomething(...args):*{
if(args.length==1){
if(args[0] is String){
return args[0] as String;
}
if(args[0] is Number){
return args[0] as Number;
}
}
if(args.length==2){
if(args[0] is Number && args[1] is Number){
return args[0]+args[1];
}
}
}
答案 3 :(得分:1)
您不能重载,但您可以为参数设置默认值,这几乎是相同的,但它确实会迫使您有时提前计划您的方法。
它之所以没有,可能主要是Adobe在设计和编写语言时投资的时间/回报。
答案 4 :(得分:1)
可能是因为Actionscript在运行时按函数名查找函数,而不是在编译时按名称和参数存储它们。
此功能可以轻松地添加和删除动态对象中的函数,以及使用object['functionName']()
按名称获取和调用函数的功能,但我认为它使得实现重载变得非常困难而不会弄乱那些特征