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

RKC*_*KCY 5 actionscript flex3 actionscript-3

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

Flex支持重载吗?

如果是,请简要说明一个真实的例子.

Luc*_*hez 22

如您所说,Action Script不支持函数重载(因此在Flex中也不支持).

但是函数可能有默认参数,如下所示:

public function DoSomething(a:String='', b:SomeObject=null, c:Number=0):void
Run Code Online (Sandbox Code Playgroud)

DoSomething 可以通过4种不同方式调用:

DoSomething()
DoSomething('aString')
DoSomething('aString', anObject)
DoSomething('aString', anObject, 123)
Run Code Online (Sandbox Code Playgroud)

这种行为可能是因为Action Script遵循ECMA Script标准.函数确实是对象的一个​​属性,因此,就像您不能拥有两个具有相同名称的属性一样,您不能拥有两个具有相同名称的函数.(这只是一个假设)

以下是第13节(PDF文件的第83页)中的标准ECMA-262(ECMAScript语言规范),当您声明类似的函数时

function Identifier(arg0, arg1) {
    // body
}
Run Code Online (Sandbox Code Playgroud)

创建当前变量对象的属性,其名称Identifier和值等于如下所示创建的Function对象:

new Function(arg0, arg1, body)
Run Code Online (Sandbox Code Playgroud)

所以,这就是为什么你不能重载一个函数,因为你不能拥有当前变量对象的多个属性同名


Chr*_*s R 9

值得注意的是,函数重载不是OOP习语,它是一种语言约定.OOP语言通常具有重载支持,但这不是必需的.

正如lk所说,你可以用它显示的结构来近似它.或者,你可以这样做:

public function overloaded(mandatory1: Type, mandatory2: Type, ...rest): *;
Run Code Online (Sandbox Code Playgroud)

此函数将需要前两个参数,然后将其余参数作为数组传递,然后您可以根据需要处理它.这可能是更灵活的方法.