'>

Redéfir la signification d'un opérateur pour une classe en C sharp

2.3.1 Introduction
Considérons l'instruction
op1 + op2
où op1 et op2 sont deux opérandes. Il est possible de redéfinir la signification de l'opérateur + . Si l'opérande op1 est un objet de
classe C1, il faut définir une méthode statique dans la classe C1 avec la signature suivante :
public static [type] operator +(C1 opérande1, C2 opérande2);
Lorsque le compilateur rencontre l'instruction
op1 + op2
il la traduit alors par C1.operator+(op1,op2). Le type rendu par la méthode operator est important. En effet, considérons l'opération
op1+op2+op3. Elle est traduite par le compilateur par (op1+op2)+op3. Soit res12 le résultat de op1+op2. L'opération qui est faite
ensuite est res12+op3. Si res12 est de type C1, elle sera traduite elle aussi par C1.operator+(res12,op3). Cela permet d'enchaîner les
opérations.
On peut redéfinir également les opérateurs unaires n'ayant qu'un seul opérande. Ainsi si op1 est un objet de type C1, l'opération
op1++ peut être redéfinie par une méthode statique de la classe C1 :
public static [type] operator ++(C1 opérande1);
Ce qui a été dit ici est vrai pour la plupart des opérateurs avec cependant quelques exceptions :
• les opérateurs == et != doivent être redéfinis en même temps
• les opérateurs && ,||, [], (), +=, -=, ... ne peuvent être redéfinis
2.3.2 Un exemple
On crée une classe ListeDePersonnes dérivée de la classe ArrayList. Cette classe implémente une liste dynamique et est présentée dans
le chapitre qui suit. De cette classe, nous n'utilisons que les éléments suivants :
• la méthode L.Add(Object o) permettant d'ajouter à la liste L un objet o. Ici l'objet o sera un objet Personne.
• la propriété L.Count qui donne le nombre d'éléments de la liste L
• la notation L[i] qui donne l'élément i de la liste L
La classe ListeDePersonnes va hériter de tous les attributs, méthodes et propriétés de la classe ArrayList. Sa définition est la suivante :
1. using System;
2. using System.Collections;
3. using System.Text;
4.
5. namespace Chap2 {
6. class ListeDePersonnes : ArrayList{
7. // redéfinition opérateur +, pour ajouter une personne à la liste
8. public static ListeDePersonnes operator +(ListeDePersonnes l, Personne p) {
9. // on ajoute la Personne p à la ListeDePersonnes l
10. l.Add(p);
11. // on rend la ListeDePersonnes l
12. return l;
13. }// operator +
14.15. // ToString
16. public override string ToString() {
17. // rend (él1, él2, ..., éln)
18. // parenthèse ouvrante
19. StringBuilder listeToString = new StringBuilder("(");
20. // on parcourt la liste de personnes (this)
21. for (int i = 0; i < Count - 1; i++) {
22. listeToString.Append(this[i]).Append(",");
23. }//for
24. // dernier élément
25. if (Count != 0) {
26. listeToString.Append(this[Count-1]);
27. }
28. // parenthèse fermante
29. listeToString.Append(")");
30. // on doit rendre un string
31. return listeToString.ToString();
32. }//ToString
33. }
34.}
• ligne 6 : la classe ListeDePersonnes dérive de la classe ArrayList
• lignes 8-13 : définition de l'opérateur + pour l'opération l + p, où l est de type ListeDePersonnes et p de type Personne ou
dérivé.
• ligne 10 : la personne p est ajoutée à la liste l. C'est la méthode Add de la classe parent ArrayList qui est ici utilisée.
• ligne 12 : la référence sur la liste l est rendue afin de pouvoir enchaîner les opérateurs + tels que dans l + p1 + p2.
L'opération l+p1+p2 sera interprétée (priorité des opérateurs) comme (l+p1)+p2. L'opération l+p1 rendra la référence l.
L'opération (l+p1)+p2 devient alors l+p2 qui ajoute la personne p2 à la liste de personnes l.
• ligne 16 : nous redéfinissons la méthode ToString afin d'afficher une liste de personnes sous la forme (personne1, personne2, ..)
où personnei est lui-même le résultat de la méthode ToString de la classe Personne.
• ligne 19 : nous utilisons un objet de type StringBuilder. Cette classe convient mieux que la classe string dès qu'il faut faire de
nombreuses opérations sur la chaîne de caractères, ici des ajouts. En effet, chaque opération sur un objet string rend un
nouvel objet string, alors que les mêmes opérations sur un objet StringBuilder modifient l'objet mais n'en créent pas un
nouveau. Nous utilisons la méthode Append pour concaténer les chaînes de caractères.
• ligne 21 : on parcourt les éléments de la liste de personnes. Cette liste est ici désignée par this. C'est l'objet courant sur
laquelle est exécutée la méthode ToString. La propriété Count est une propriété de la classe parent ArrayList.15. // ToString
16. public override string ToString() {
17. // rend (él1, él2, ..., éln)
18. // parenthèse ouvrante
19. StringBuilder listeToString = new StringBuilder("(");
20. // on parcourt la liste de personnes (this)
21. for (int i = 0; i < Count - 1; i++) {
22. listeToString.Append(this[i]).Append(",");
23. }//for
24. // dernier élément
25. if (Count != 0) {
26. listeToString.Append(this[Count-1]);
27. }
28. // parenthèse fermante
29. listeToString.Append(")");
30. // on doit rendre un string
31. return listeToString.ToString();
32. }//ToString
33. }
34.}
• ligne 6 : la classe ListeDePersonnes dérive de la classe ArrayList
• lignes 8-13 : définition de l'opérateur + pour l'opération l + p, où l est de type ListeDePersonnes et p de type Personne ou
dérivé.
• ligne 10 : la personne p est ajoutée à la liste l. C'est la méthode Add de la classe parent ArrayList qui est ici utilisée.
• ligne 12 : la référence sur la liste l est rendue afin de pouvoir enchaîner les opérateurs + tels que dans l + p1 + p2.
L'opération l+p1+p2 sera interprétée (priorité des opérateurs) comme (l+p1)+p2. L'opération l+p1 rendra la référence l.
L'opération (l+p1)+p2 devient alors l+p2 qui ajoute la personne p2 à la liste de personnes l.
• ligne 16 : nous redéfinissons la méthode ToString afin d'afficher une liste de personnes sous la forme (personne1, personne2, ..)
où personnei est lui-même le résultat de la méthode ToString de la classe Personne.
• ligne 19 : nous utilisons un objet de type StringBuilder. Cette classe convient mieux que la classe string dès qu'il faut faire de
nombreuses opérations sur la chaîne de caractères, ici des ajouts. En effet, chaque opération sur un objet string rend un
nouvel objet string, alors que les mêmes opérations sur un objet StringBuilder modifient l'objet mais n'en créent pas un
nouveau. Nous utilisons la méthode Append pour concaténer les chaînes de caractères.
• ligne 21 : on parcourt les éléments de la liste de personnes. Cette liste est ici désignée par this. C'est l'objet courant sur
laquelle est exécutée la méthode ToString. La propriété Count est une propriété de la classe parent ArrayList.
• ligne 22 : l'élément n° i de la liste courante this est accessible via la notation this[i]. Là encore, c'est une propriété de la
classe ArrayList. Comme il s'agit d'ajouter des chaînes, c'est la méthode this[i].ToString() qui va être utilisée. Comme cette
méthode est virtuelle, c'est la méthode ToString de l'objet this, de type Personne ou dérivé, qui va être utilisée.
• ligne 31 : il nous faut rendre un objet de type string (ligne 16). La classe StringBuilder a une méthode ToString qui permet de
passer d'un type StringBuilder à un type string.
On notera que la classe ListeDePersonnes n'a pas de constructeur. Dans ce cas, on sait que le constructeur 
public ListeDePersonnes(){
}
sera utilisé. Ce constructeur ne fait rien si ce n'est appeler le constructeur sans paramètres de sa classe parent :
public ArrayList(){
...
}
Une classe de test pourrait être la suivante :
1. using System;
2.
3. namespace Chap2 {
4. class Program1 {
5. static void Main(string[] args) {
6. // une liste de personnes
7. ListeDePersonnes l = new ListeDePersonnes();
8. // ajout de personnes
9. l = l + new Personne("jean", "martin",10) + new Personne("pauline", "leduc",12);
10. // affichage
11. Console.WriteLine("l=" + l);
12. l = l + new Enseignant("camille", "germain",27,60);
13. Console.WriteLine("l=" + l);
14. }
15. }
16.}
• ligne 7 : création d'une liste de personnes l
• ligne 9 : ajout de 2 personnes avec l'opérateur +
• ligne 12 : ajout d'un enseignant
• lignes 11 et 13 : utilisation de la méthode redéfinie ListeDePersonnes.ToString().

Les résultats :
1. l=([jean, martin, 10],[pauline, leduc, 12])
2. l=([jean, martin, 10],[pauline, leduc, 12],Enseignant[[camille, germain, 27],60])

Publié par Drupal french Study