DOCUMENTATION EN LIGNE
DE WINDEVWEBDEV ET WINDEV MOBILE

Aide / WLangage / Syntaxe WLangage / Procédures WLangage
  • Présentation
  • Comment le faire ?
  • Ajouter des syntaxes à une procédure
  • Supprimer une syntaxe de procédure
  • Gestion du multisyntaxe en exécution
  • Mécanisme de base : détermination dynamique de la syntaxe selon le nombre et le type des paramètres
  • Dynamic dispatch
  • Méthodes virtuelles
  • Notes
  • Notes
  • Portée des procédures
WINDEV
WindowsLinuxUniversal Windows 10 AppJavaEtats et RequêtesCode Utilisateur (MCU)
WEBDEV
WindowsLinuxPHPWEBDEV - Code Navigateur
WINDEV Mobile
AndroidWidget AndroidiPhone/iPadWidget IOSApple WatchMac CatalystUniversal Windows 10 App
Autres
Procédures stockées
Présentation
Les procédures et les méthodes de classes peuvent avoir plusieurs syntaxes.
Par exemple, une procédure peut avoir :
  • une syntaxe qui prend en paramètre une chaîne.
  • une syntaxe qui prend en paramètre un entier.
Il est ainsi possible d'avoir différentes syntaxes pour une même procédure ou une même méthode avec des paramètres et du code différents. A l'exécution, le moteur détermine automatiquement la syntaxe à appeler en fonction du nombre et du type des paramètres passés.
Cette technologie est souvent présentée sous différentes appellations et englobe différents objectifs. Parmi ces appellations, on retrouve les termes suivants :
  • Multisyntaxe,
  • Surcharge de prototype,
  • Overload,
  • Dynamic dispatch,
  • Polymorphisme paramétrique,
  • etc.
Cette fonctionnalité est disponible pour :
  • Les procédures globales.
  • Les procédures locales.
  • Les méthodes de classe y compris les Constructeurs.
    Nouveauté SaaS
    AndroidWidget Android Les constructeurs des classes dérivées peuvent désormais être multisyntaxes.
Dans la suite de ce document :
  • le terme multisyntaxe sera utilisé.
  • le mot-clé "Procédure" sera utilisé pour désigner une procédure globale, une procédure locale ou bien une méthode.
Comment le faire ?

Ajouter des syntaxes à une procédure

Pour ajouter une syntaxe à une procédure existante :
  1. Dans l'explorateur de projet, sélectionnez la procédure.
  2. Affichez le menu contextuel de la procédure et choisissez l'option "Ajouter une syntaxe".
  3. Une nouvelle syntaxe est automatiquement créée dans l'éditeur de code.
Remarques :
  • La création d'une procédure de même nom propose automatiquement d'ajouter une nouvelle syntaxe à la procédure existante.
  • Si une procédure a plusieurs syntaxes, le nombre de syntaxes est affiché dans l'explorateur de projet (à côté du nom de la procédure).

Supprimer une syntaxe de procédure

Pour supprimer une syntaxe :
  1. Affichez le code de la procédure dans l'éditeur de code.
  2. Dans le bandeau de la syntaxe, choisissez l'option "Supprimer" du menu contextuel.
  3. Vous pouvez :
    • supprimer la syntaxe courante.
    • supprimer toutes les syntaxes (dans ce cas, la procédure est supprimée).
Gestion du multisyntaxe en exécution

Mécanisme de base : détermination dynamique de la syntaxe selon le nombre et le type des paramètres

Le moteur d'exécution recherche la syntaxe :
  • dont le nombre de paramètres correspond.
  • pour laquelle le nombre de conversions est minimal.
Si deux syntaxes sont équivalentes, c'est la première dans l'ordre de l'éditeur de code qui est exécutée.
Exemple de base :
// Première syntaxe
PROCÉDURE p(s est une chaîne)
// Deuxième syntaxe
PROCÉDURE p(n est un entier)
// Troisième syntaxe
PROCÉDURE p(n est un entier, s est une chaîne)
// Quatrième syntaxe
PROCÉDURE p(s est une chaîne, n est un entier)
// Appels
 
// Appelle la première syntaxe (meilleure syntaxe correspondant)
p("A")
 
// Appelle la deuxième syntaxe (meilleure syntaxe correspondant)
p(1)
 
// Appelle la troisième syntaxe (meilleure syntaxe correspondant)
p(1,"A")
 
// Appelle la quatrième syntaxe (meilleure syntaxe correspondant)
p("A",1)
 
// Appelle la troisième syntaxe
// (équivalente à la quatrième, la troisième est prioritaire car décrite avant)
p(1,1)
 
// Appelle la troisième syntaxe
// (équivalente à la quatrième, la troisième est prioritaire car décrite avant)
p("A","A")

Dynamic dispatch

Dans le cas d'une procédure à plusieurs syntaxes dont les paramètres attendent des instances de classe, le moteur d'exécution utilise la méthode du "Dynamic dispatch" pour déterminer la syntaxe à appeler.
Considérons l'exemple suivant :
  • une classe "ClasseBase"
  • deux classes "ClasseDérivée1" et "ClasseDérivée2" qui héritent de "ClasseBase".
// Première syntaxe
PROCÉDURE p(LOCAL p est ClasseBase)
// Seconde syntaxe
PROCÉDURE p(LOCAL p est ClasseDérivée1)
// Appels
pBase est ClasseBase dynamique
pBase = allouer ClasseBase // Initialisation
p(pBase) // Première syntaxe
pBase = allouer ClasseDérivée1 // Initialisation
p(pBase) // Seconde syntaxe
pBase = allouer ClasseDérivée2 // Initialisation
p(pBase) // Première syntaxe

Méthodes virtuelles

Pour la gestion des méthodes virtuelles, plusieurs aspects peuvent être pris en compte :
  • 1er aspect : une syntaxe de la méthode de la classe dérivée redéfinit une syntaxe de la méthode de la classe de base
    ClasseBase
    PROCÉDURE meth(s est une chaîne)
    PROCÉDURE meth(n est un entier)
     
    ClasseDérivée
    PROCÉDURE meth(n est un entier)
     
    // Appel
    oBase est ClasseBase
    // Appelle la première syntaxe dans la classe ClasseBase
    oBase.meth("A")
    // Appelle la deuxième syntaxe dans la classe ClasseBase
    oBase.meth(1)
     
    oDérivée est ClasseDérivée
    // Appelle la première syntaxe dans la classe ClasseBase
    oDérivée.meth("A")
    // Appelle la première syntaxe dans la classe ClasseDérivée
    oDérivée.meth(1)
  • 2ème aspect : une syntaxe supplémentaire dans la méthode de la classe dérivée
    ClasseBase
    PROCÉDURE meth(p)
    PROCÉDURE meth(s est une chaîne)
     
    ClasseDérivée
    PROCÉDURE meth(n est un entier)
     
    // Appel
    oBase est ClasseBase
    // Appelle la deuxième syntaxe dans la classe ClasseBase
    oBase.meth("A")
    // Appelle la première syntaxe dans la classe ClasseBase
    oBase.meth(1)
     
    oDérivée est ClasseDérivée
    // Appelle la deuxième syntaxe dans la classe ClasseBase
    oDérivée.meth("A")
    // Appelle la première syntaxe dans la classe ClasseDérivée
    oDérivée.meth(1)
  • 3ème aspect : cas particulier lorsque la méthode de la classe de base et la méthode de la classe dérivée ont chacune une seule syntaxe avec des prototypes différents :
    ClasseBase
    PROCÉDURE meth(s est une chaîne)
     
    ClasseDérivée
    PROCÉDURE meth(n est un entier)

    Le compilateur ne peut pas décider si la méthode de la classe dérivée est une redéfinition de celle de la classe de base ou une nouvelle syntaxe.
    • Pour provoquer une redéfinition, il faut ajouter l'attribut d'extension <redéfinition> à la méthode de la classe dérivée.
      PROCEDURE méthode(...) <redéfinition>
    • Pour provoquer une multisyntaxe, il faut ajouter l'attribut d'extension <multisyntaxe> à la méthode de la classe dérivée.
      PROCEDURE méthode(...) <multisyntaxe>

Notes

  • Dans de nombreux cas, il est nécessaire de forcer les paramètres en LOCAL pour respecter les règles de passage des paramètres du WLangage.
  • Si la détermination dynamique de la syntaxe trouve une syntaxe compatible, celle-ci peut provoquer une erreur d'exécution sur les règles de passage des paramètres par référence.
Notes

Portée des procédures

Les procédures globales et les méthodes de classe peuvent être publiques, protégées ou privées. Dans le cas d'une procédure multisyntaxe, la portée doit être la même pour toutes les syntaxes. Si les portées des syntaxes sont différentes, une erreur de compilation est générée.
Version minimum requise
  • Version 16
Documentation également disponible pour…
Commentaires
Android
Comment surcharger un constructeur pour une configuration Android avec windev mobile 25?
saien
10 jan. 2020

Dernière modification : 04/09/2024

Signaler une erreur ou faire une suggestion | Aide en ligne locale