为什么在Actionscript中不支持重载?

时间:2009-11-24 17:41:55

标签: actionscript-3 actionscript flex3

Action脚本是基于面向对象编程开发的,但为什么它不支持函数重载?

Flex是否支持重载?

如果是,请用一个真实的例子进行简要说明。

5 个答案:

答案 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']()按名称获取和调用函数的功能,但我认为它使得实现重载变得非常困难而不会弄乱那些特征