Vous êtes sur la page 1sur 9

IFT 1179 : Programmation en C#

A) Redfinition de mthode :
On a dj vu la surcharge des mthodes :des mthodes diffrentes qui portement le mme nom. En C#, object est la classe parente au sommet de lhirarchie des classes prdfinies en C# ou inventes par lusager. Dans object, parmi dautres mthodes, on y trouve : 1. public string ToString() la prsentation dun objet en chane de caractres quon utilise dans laffichage, dans la concatnation. 2. public bool Equals(object autre) retourne vrai ou faux selon ce que lobjet courant dispose du mme contenu quun autre objet La notion de redfinition dune mthode implique quon crit une mthode dans une classe qui respecte la syntaxe dune mthode existence dans une classe parente.

IFT 1179, Automne 2005 (par Le Van N.) Semaine 6 : Redfinition de mthode + Rvision pour lintra

68

1) Redfinition de ToString() :
a) Cas 1 : la classe ne dispose pas de ToString() C# remonte dans lhirarchie et applique la mthode ToString() dune classe parente. Si C# applique cette mthode de object, il retourne le nom de la classe. Soient deux personnes construites dune classe nomme Personne qui ne dispose pas de redfinition de ToString :
Personne pers1 = new Personne("Tremblay Pierre", 1.78, 65.8); Console.WriteLine("Informations de la premiere personne : " + pers1.ToString()); Personne pers2 = new Personne("Charbonneau Lise", 1.62, 58.9); Console.WriteLine("Informations de la deuxieme personne : " + pers2);

On obtient lexcution suivante : Informations de la premiere personne : Personne Informations de la deuxieme personne : Personne Press any key to continue b) Cas 2 : la classe redfinit la mthode ToString() 1. style classique dans les langages de la POO : public override string ToString() { return 1 chane de caractres reprsentant lobjet } Exemple : on redfinit ToString() dans la classe Personne comme la suivante :

public override string ToString() { return nomPre + " " + taille + " metre, " + poids + " kg"; }

On obtient alors :
IFT 1179, Automne 2005 (par Le Van N.) Semaine 6 : Redfinition de mthode + Rvision pour lintra 69

Informations de 1,78 metre, 65,8 Informations de 1,62 metre, 58,9 Press any key to

la premiere personne : Tremblay Pierre kg la deuxieme personne : Charbonneau Lise kg continue

2. nouveau style de C# (et de version 1.5 de Java) : On utilise la mthode string.Format chane formate. Exemple pour retourner une

public override string ToString() { return string.Format("{0, 15} {1, 6:F2} metre {2, 5:F1} kg", nomPre, taille, poids); }

Lors de lexcution, on obtient : Informations de 1,78 metre 65,8 Informations de 1,62 metre 58,9 Press any key to la premiere personne : Tremblay Pierre kg la deuxieme personne : Charbonneau Lise kg continue

2) Redfinition de Equals (object obj):


Entre deux objets : obj1 = obj2 ; lobjet 1 rfre vers la m^me zone de mmoire que lobjet 2 obj1 == obj2 ces deux objets rfrent-ils vers la mme zone de mmoire ?

Avec pers1 et pers2 construits prcdemment, linstruction Console.WriteLine("pers1 == pers2 vaut " + (pers1 == pers2)); affiche false Par contre, les deux instructions :
pers1 = pers2; Console.WriteLine("pers1 == pers2 vaut " + (pers1 == pers2));

font afficher : true

IFT 1179, Automne 2005 (par Le Van N.) Semaine 6 : Redfinition de mthode + Rvision pour lintra

70

Pour comparer le contenu de 2 objets, on utilise plutt la mthode Equals : Dans object, cette mthode compare selon la rfrence car les auteurs de cette mthode ne savent rien sur les classes cres plus tard pour comparter le contenu de deux objets. public bool Equals(object autre)

a) Cas 1 : la classe ne dispose pas de Equals(...) C# remonte Equals(. . mthode de rfrences dans lhirarchie et applique la mthode .) dune classe parente. Si C# applique cette object, il retourne la comparaison entre deux (au lieu de leurs contenus).

On ajoute la troisime personne qui a le mme contenu de la premire personne :


Console.WriteLine("pers1.Equals(pers2) vaut " + pers1.Equals(pers2)); Personne pers3 = new Personne("Tremblay Pierre", 1.78, 65.8); Console.WriteLine("pers1.Equals(pers3) vaut " + pers1.Equals(pers3));

Lexcution donne : pers1.Equals(pers2) vaut False pers1.Equals(pers3) vaut False Press any key to continue Cas 2 : redfinition de Equals(...) a) version plus simple (cas de la classe Personne)
public override bool Equals(object obj) { Personne autre = (Personne) obj; return nomPre.ToUpper().Equals(autre.nomPre.ToUpper()); }

Lexcution du codage prcdent nous donne :

IFT 1179, Automne 2005 (par Le Van N.) Semaine 6 : Redfinition de mthode + Rvision pour lintra

71

pers1.Equals(pers2) vaut False pers1.Equals(pers3) vaut True Press any key to continue b) version plus dtaille : Les experts en POO suggrent toujours de respecter : 1. obj.Equals(obj) retourne toujours True; 2. obj1.Equals(obj2) et obj2.Equals(obj1) disposent toujours du mme rsultat 3. Si obj1.Equals(obj2) vaut True et obj2.Equals(obj3) vaut True alors obj1.Equals(obj3) vaut aussi True De plus, une comparaison du genre pers.Equals(unCercle) devrait retourner toujours False (objets incompatibles).

Voici lexemple de redfinition de Equals dans la classe Station (des mtros) :


public override bool Equals (object obj) { if (this == obj) return true; // comparer lui-mme else if (obj.GetType() != this.GetType()) // incomparable! return false; else { Station autre = (Station) obj; return nom.ToUpper().Equals(autre.nom.ToUpper()); } }

Les mthodes de recherche squentielle dans les collections (exemple Array) sont bases sur la redfinition de Equals.

IFT 1179, Automne 2005 (par Le Van N.) Semaine 6 : Redfinition de mthode + Rvision pour lintra

72

Fichier : Redefinition0.cs (aucune redfinition) :


/* Redefinition0.cs * Pas de rednition de ToString ni de Equals * */ using System; using System.IO; class Personne { // champs (field) d'informations private string nomPre; private double taille; private double poids;

// un constructeur public Personne(string nomPre, double taille, double poids) { this.nomPre = nomPre; this.taille = taille; this.poids = poids; } // AUCUNE redfinition } class Redefinition0 {

static void Main(string[] args) { Personne pers1 = new Personne("Arcand Pierre",1.75, 65.4), pers2 = new Personne("Charbonneau Luc",1.89, 76.2), pers3 = new Personne("Arcand Pierre",1.75, 65.4); Console.WriteLine("Infos de pers1 : " + pers1.ToString()); Console.WriteLine("pers1 = pers3 vaut : " + (pers1 == pers3)); Console.WriteLine("pers1.Equals(pers3) vaut : " + pers1.Equals(pers3)); } } /* Excution: Infos de pers1 : Personne pers1 = pers3 vaut : False pers1.Equals(pers3) vaut : False Press any key to continue */

IFT 1179, Automne 2005 (par Le Van N.) Semaine 6 : Redfinition de mthode + Rvision pour lintra

73

Fichier : Redefinition1.cs (redfinition, style simple)


/* Redefinition1.cs * On redfinit de ToString et de Equals * Style simple */ using System; using System.IO; class Personne { // champs (field) d'informations private string nomPre; private double taille; private double poids;

// un constructeur public Personne(string nomPre, double taille, double poids) { this.nomPre = nomPre; this.taille = taille; this.poids = poids; } public override string ToString() { return nomPre + " " + taille + " metre, " + poids + " kg"; } public override bool Equals(object obj) { // version SIMPLE return nomPre.ToUpper().Equals ( ((Personne) obj).nomPre.ToUpper()); } } class Redefinition0 { static void Main(string[] args) { Personne pers1 = new Personne("Arcand Pierre",1.75, 65.4), pers2 = new Personne("Charbonneau Luc",1.89, 76.2), pers3 = new Personne("Arcand Pierre",1.75, 65.4); Console.WriteLine("Infos de pers1 : " + pers1.ToString()); Console.WriteLine("pers1 = pers3 vaut : " + (pers1 == pers3)); Console.WriteLine("pers1.Equals(pers3) vaut : " + pers1.Equals(pers3)); } }

IFT 1179, Automne 2005 (par Le Van N.) Semaine 6 : Redfinition de mthode + Rvision pour lintra

74

/* Excution: Infos de pers1 : Arcand Pierre 1,75 metre, 65,4 kg pers1 = pers3 vaut : False pers1.Equals(pers3) vaut : True Press any key to continue */

Fichier:Redefinition2.cs (redfinition, style plus complet)


/* Redefinition2.cs * On redfinit de ToString et de Equals * Style plus complet */ using System; using System.IO; class Personne { // champs (field) d'informations private string nomPre; private double taille; private double poids;

// un constructeur public Personne(string nomPre, double taille, double poids) { this.nomPre = nomPre; this.taille = taille; this.poids = poids; } public override string ToString() { return string.Format("{0, 15} {1, 6:F2} metre {2, 7:F1} kg", nomPre, taille, poids); } public override bool Equals(object obj) { if (this == obj) // comparer lui-mme return true; else if ( this.GetType() != obj.GetType() ) return false; else return nomPre.ToUpper().Equals ( ((Personne) obj).nomPre.ToUpper()); }

IFT 1179, Automne 2005 (par Le Van N.) Semaine 6 : Redfinition de mthode + Rvision pour lintra

75

class Redefinition0 {

static void Main(string[] args) { Personne pers1 = new Personne("Arcand Pierre",1.75, 65.4), pers2 = new Personne("Charbonneau Luc",1.89, 76.2), pers3 = new Personne("Arcand Pierre",1.75, 65.4); Console.WriteLine("Infos de pers1 : " + pers1.ToString()); Console.WriteLine("pers1 = pers3 vaut : " + (pers1 == pers3)); Console.WriteLine("pers1.Equals(pers3) vaut : " + pers1.Equals(pers3)); } } /* Excution: Infos de pers1 : Arcand Pierre pers1 = pers3 vaut : False pers1.Equals(pers3) vaut : True Press any key to continue */

1,75 metre

65,4 kg

-------------

FIN DE MATIRES DINTRA -------

IFT 1179, Automne 2005 (par Le Van N.) Semaine 6 : Redfinition de mthode + Rvision pour lintra

76

Vous aimerez peut-être aussi