|
- 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
Surcharge de prototype/Multisyntaxe
Ajouter des syntaxes à une procédure Pour ajouter une syntaxe à une procédure existante : - Dans l'explorateur de projet, sélectionnez la procédure.
- Affichez le menu contextuel de la procédure et choisissez l'option "Ajouter une syntaxe".
- 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 : - Affichez le code de la procédure dans l'éditeur de code.
- Dans le bandeau de la syntaxe, choisissez l'option "Supprimer" du menu contextuel.
- 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 PROCEDURE p(s est une chaîne)
// Deuxième syntaxe PROCEDURE p(n est un entier)
// Troisième syntaxe PROCEDURE p(n est un entier, s est une chaîne)
// Quatrième syntaxe PROCEDURE 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 PROCEDURE p(LOCAL p est ClasseBase)
// Seconde syntaxe PROCEDURE 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 PROCEDURE meth(s est une chaîne) PROCEDURE meth(n est un entier)
ClasseDérivée PROCEDURE 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 PROCEDURE meth(p) PROCEDURE meth(s est une chaîne)
ClasseDérivée PROCEDURE 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 PROCEDURE meth(s est une chaîne)
ClasseDérivée PROCEDURE 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.
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.
Documentation également disponible pour…
|
|
|
| |
| | Comment surcharger un constructeur pour une configuration Android avec windev mobile 25? |
|
|
|
| |
| |
| |
| |
| |
| |
| | |
| |