2009-11-24 14 views
5

La secuencia de comandos de acción se desarrolla en función de la programación orientada a objetos, pero ¿por qué no admite la sobrecarga de funciones?¿por qué la sobrecarga no admite en Actionscript?

¿Flex overloading soporta?

En caso afirmativo, explique brevemente con un ejemplo real.

+1

Flex es "solo" un framework ... por lo que no ofrece nada más que actionscript 3 – TheHippo

Respuesta

22

Como dices, la sobrecarga de funciones no es compatible con Action Script (y, por lo tanto, ni siquiera en Flex).

Pero las funciones pueden tener parámetros por defecto como aquí:

public function DoSomething(a:String='', b:SomeObject=null, c:Number=0):void 

DoSomething se puede llamar de 4 formas diferentes:

DoSomething() 
DoSomething('aString') 
DoSomething('aString', anObject) 
DoSomething('aString', anObject, 123) 

Este comportamiento tal vez se debe a la acción de secuencias de comandos sigue el estándar ECMA Script. Una función es, de hecho, una propiedad del objeto, por lo que, como NO PUEDE tener dos propiedades con el mismo nombre, NO PUEDE tener dos funciones con el mismo nombre. (Esto es sólo una hipótesis)

Aquí es el estándar ECMA-262 (ECMAScript Language Specification) en la sección 13 (página 83 del archivo PDF) dice que cuando se declara una función como

function Identifier(arg0, arg1) { 
    // body 
} 

Crear una propiedad del objeto variable actual con el nombre Identifier y el valor es igual a un objeto Function creado de esta manera:

new Function(arg0, arg1, body) 

Por lo tanto, es por eso que no se puede sobrecargar una función, ya que no puede tener más de una propiedad del objeto variable actual con el mismo nombre

9

Vale la pena señalar que la sobrecarga de funciones no es una programación orientada a objetos idioma, es una convención de lenguaje. Los lenguajes de OOP a menudo tienen soporte de sobrecarga, pero no es necesario.

Como notas lk, puede aproximarlo con la estructura que muestra. Alternativamente, usted puede hacer esto:

public function overloaded(mandatory1: Type, mandatory2: Type, ...rest): *; 

Esta función requerirá los dos primeros argumentos y luego pasar el resto en forma de matriz, que luego se puede manejar como sea necesario. Este es probablemente el enfoque más flexible.

+1

El parámetro ... rest no solo puede ser una matriz, de hecho puede ser de cero a N parámetros separados por una coma. (PD: lo siento por mi pobre inglés) –

+1

Estás en lo cierto, lo que estoy diciendo es que dentro de la función 'rest' está una' Array' de los parámetros separados por comas. –

1

Hay otra forma: la función con cualquier parámetro devuelve algo.

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]; 
     } 
    } 

} 
+1

Esto es tan Anti-OOP :( –

+0

Tal vez puedas aclarar el OP en cuanto a por qué, lk? – typeoneerror

+0

es una buena solución, si realmente quieres hacer esto – Omu

1

No se puede sobrecargar, pero puede establecer valores predeterminados para los argumentos que es prácticamente lo mismo, pero sí le obligan a planificar sus métodos por delante veces.

Probablemente, la razón por la que no lo es es una cuestión de tiempo/retorno de la inversión para Adobe al diseñar y escribir el idioma.

1

Probablemente porque Actionscript busca funciones por nombre de función en tiempo de ejecución, en lugar de almacenarlas por nombre y parámetros en tiempo de compilación.

Esta característica facilita la tarea de agregar y eliminar funciones de objetos dinámicos, y la capacidad de obtener y llamar funciones por nombre usando object['functionName'](), pero imagino que dificulta la implementación de la sobrecarga sin tener que hacer esas funciones.

+1

Mientras esto es cierto para AS3, es completamente falso para AS3 (al que se refiere esta pregunta). Los objetos AS3 son estáticos y tienen una tabla de métodos. Los objetos Expando solo están disponibles marcando una clase como 'dinámica'. El acceso al miembro con límite de tiempo, como su ejemplo, es manejado explícitamente por el AVM, pero no es el predeterminado. –

+0

¡Gracias por la actualización! ¿Quiso decir que AS2 busca funciones por nombre? –

Cuestiones relacionadas