|
|
|
|
- Presentación
- ¿Cómo proceder?
- Añadiendo sintaxis a una Procedure
- Borrar una sintaxis de Procedure
- Gestión de overload en tiempo de ejecución
- Mecanismo básico: determinación dinámica de la sintaxis según el número y tipo de parámetros
- Despacho dinámico
- Métodos virtuales
- Notas
- Notas
- Alcance de los procedimientos
Prototipo overload/overload
Los procedimientos y los métodos de las clases pueden tener varias sintaxis. Por ejemplo, un Procedure puede tener: - una sintaxis que toma una cadena en el parámetro.
- una sintaxis que toma un número entero en parámetro.
Por lo tanto, pueden existir varias sintaxis para la misma Procedure o para el mismo método con diferentes parámetros y código. En tiempo de ejecución, el motor define automáticamente la sintaxis de llamada en función del número y del tipo de parámetros pasados. Esta tecnología se presenta bajo varios nombres e incluye diferentes propósitos. Se pueden utilizar los siguientes términos: - Sobrecargar,
- Prototipo overload,
- Sobrecargar,
- Despacho dinámico,
- Polimorfismo paramétrico,
- etc.
Esta función está disponible para: - Los procedimientos globales.
- Los procedimientos locales.
- Los métodos de la clase, incluidos los Constructores.
En el resto de esta Document: - utilizaremos el término overload.
- la palabra clave "Procedure" se usará para identificar un Procedure global, un Procedure local o un método.
Añadiendo sintaxis a una Procedure Para añadir una sintaxis a un Procedure existente: - En el explorador del proyecto, seleccione el Procedure.
- Abra el menú contextual de Procedure y seleccione "Añadir una sintaxis"..
- Se crea automáticamente una nueva sintaxis en el editor de código.
Observaciones: - La creación de un Procedure con el mismo nombre propone automáticamente añadir una nueva sintaxis al Procedure existente.
- Si una Procedure tiene varias sintaxis, el número de sintaxis se muestra en el explorador del proyecto (junto al nombre de la Procedure).
Borrar una sintaxis de Procedure Para borrar una sintaxis: - Mostrar el código de la Procedure en el editor de códigos.
- En la barra de la sintaxis, seleccione "Borrar" de el menú contextual.
- Es posible:
- borrar la sintaxis actual.
- borrar todas las sintaxis (en este caso, se borra la Procedure).
Gestión de overload en tiempo de ejecución Mecanismo básico: determinación dinámica de la sintaxis según el número y tipo de parámetros El motor de tiempo de ejecución busca la sintaxis: - que tiene el mismo número de parámetros.
- que tiene el número mínimo de conversiones.
Si dos sintaxis son equivalentes, se ejecuta la primera en el orden del editor de código. Ejemplo básico // First syntax PROCÉDURE p(s is string)
// Second syntax PROCÉDURE p(n is int)
// Third syntax PROCÉDURE p(n is int, s is string)
// Fourth syntax PROCÉDURE p(s is string, n is int)
// Calls
// Calls the first syntax (best corresponding syntax) p("A")
// Calls the second syntax (best corresponding syntax) p(1)
// Calls the third syntax (best corresponding syntax) p(1,"A")
// Calls the fourth syntax (best corresponding syntax) p("A",1)
// Calls the third syntax // (equivalent to the fourth one, the third one has priority because described before) p(1,1)
// Calls the third syntax // (equivalent to the fourth one, the third one has priority because described before) p("A","A")
Despacho dinámico Para una Procedure con varias sintaxis cuyos parámetros esperan instancias de clase, el motor de tiempo de ejecución está usando el método de "Despacho Dinámico" para definir la sintaxis que debe ser llamada. Veamos el siguiente ejemplo: - una clase "BaseClass
- dos clases, "DerivedClass1" y "DerivedClass2", que heredan de "BaseClass".
// First syntax PROCÉDURE p(LOCAL p is BaseClass)
// Second syntax PROCÉDURE p(LOCAL p is DerivedClass1)
// Calls pBase is dynamic BaseClass pBase = new BaseClass // Initialization p(pBase) // First syntax pBase = new DerivedClass1 // Initialization p(pBase) // Second syntax pBase = new DerivedClass2 // Initialization p(pBase) // First syntax
Métodos virtuales Para gestionar los métodos virtuales, se pueden tener en cuenta varios aspectos: - 1er aspecto: una sintaxis del método de la clase derivada redefine una sintaxis del método de la clase base
BaseClass PROCÉDURE meth(s is string) PROCÉDURE meth(n is int)
DerivedClass PROCÉDURE meth(n is int)
// Call oBase is BaseClass // Calls the first syntax in the BaseClass class oBase.meth("A") // Calls the second syntax in the BaseClass class oBase.meth(1)
oDerived is DerivedClass // Calls the first syntax in the BaseClass class oDerived.meth("A") // Calls the first syntax in the DerivedClass class oDerived.met (1)
- 2º aspecto: una sintaxis adicional en el método de la clase derivada
BaseClass PROCÉDURE meth(p) PROCÉDURE meth(s is string)
DerivedClass PROCÉDURE meth(n is int)
// Call oBase is BaseClass // Calls the second syntax in the BaseClass class oBase.meth("A") // Calls the first syntax in the BaseClass class oBase.meth(1)
oDerived is DerivedClass // Calls the second syntax in the BaseClass class oDerived.meth("A") // Calls the first syntax in the DerivedClass class oDerived.met (1)
- 3er aspecto: caso especial cuando el método de la clase base y el método de la clase derivada tienen una sintaxis única con diferentes prototipos:
BaseClass PROCÉDURE meth(s is string)
DerivedClass PROCÉDURE meth(n is int)
El compilador no puede decidir si el método de la clase derivada es una override del método de la clase base o una nueva sintaxis.- Para activar un override, el atributo con la extensión <override> debe ser añadido al método de la clase derivada.
PROCEDURE method(...) <override> - Para activar un overload, el atributo con la extensión <overload> debe ser añadido al método de la clase derivada.
PROCEDURE method(...) <overload>
Notas - En la mayoría de los casos, debe forzar los parámetros a LOCAL para respetar las reglas de WLanguage para pasar los parámetros.
- Si la determinación dinámica de la sintaxis encuentra una sintaxis compatible, ésta puede desencadenar un error de tiempo de ejecución en las reglas de paso de parámetros de reference.
Alcance de los procedimientos Los procedimientos globales y el método de clase pueden ser públicos, protegidos o privados.. Para una Procedure sobrecargada, el alcance debe ser el mismo para todas las sintaxis. Se produce un error de compilación si los alcances de las sintaxis son diferentes.
Esta página también está disponible para…
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|