|
|
|
|
|
- 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
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.
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.
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 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.
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…
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|