AYUDA EN LÍNEA
 WINDEVWEBDEV Y WINDEV MOBILE

Este contenido se ha traducido automáticamente.  Haga clic aquí  para ver la versión en inglés.
Ayuda / WLanguage / Sintaxis WLanguage / Procedimientos WLanguage
  • 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
WINDEV
WindowsLinuxUniversal Windows 10 AppJavaReportes y ConsultasCódigo de Usuario (UMC)
WEBDEV
WindowsLinuxPHPWEBDEV - Código Navegador
WINDEV Mobile
AndroidWidget Android iPhone/iPadIOS WidgetApple WatchMac CatalystUniversal Windows 10 App
Otros
Procedimientos almacenados
Presentación
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.
    AndroidWidget Android Los constructores de las clases derivadas no pueden ser sobrecargados.
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.
¿Cómo proceder?

Añadiendo sintaxis a una Procedure

Para añadir una sintaxis a un Procedure existente:
  1. En el explorador del proyecto, seleccione el Procedure.
  2. Abra el menú contextual de Procedure y seleccione "Añadir una sintaxis"..
  3. 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:
  1. Mostrar el código de la Procedure en el editor de códigos.
  2. En la barra de la sintaxis, seleccione "Borrar" de el menú contextual.
  3. 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.
Notas

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.
Versión mínima requerida
  • Versión 16
Esta página también está disponible para…
Comentarios
Haga clic en [Agregar] para publicar un comentario

Última modificación: 27/05/2022

Señalar un error o enviar una sugerencia | Ayuda local