You are on page 1of 9

IFT 1179 : Programmation en C#

A) Redéfinition de méthode :
On a déjà vu la surcharge des méthodes :des méthodes différentes qui portement le même nom. En C#, object est la classe parente au sommet de l’hiérarchie des classes prédéfinies en C# ou inventées par l’usager. Dans object, parmi d’autres méthodes, on y trouve : 1. public string ToString() la présentation d’un objet en chaîne de caractères qu’on utilise dans l’affichage, dans la concaténation. 2. public bool Equals(object autre) retourne vrai ou faux selon ce que l’objet courant dispose du même contenu qu’un autre objet La notion de redéfinition d’une méthode implique qu’on écrit une méthode dans une classe qui respecte la syntaxe d’une méthode existence dans une classe parente.

IFT 1179, Automne 2005 (par Le Van N.) Semaine 6 : Redéfinition de méthode + Révision pour l’intra

68

WriteLine("Informations de la deuxieme personne : " + pers2).9). 58.ToString()).62. Si C# applique cette méthode de object.78. 1. " + poids + " kg". Automne 2005 (par Le Van N.) Semaine 6 : Redéfinition de méthode + Révision pour l’intra 69 .WriteLine("Informations de la premiere personne : " + pers1. Soient deux personnes construites d’une classe nommée Personne qui ne dispose pas de redéfinition de ToString : Personne pers1 = new Personne("Tremblay Pierre". il retourne le nom de la classe. } On obtient alors : IFT 1179. style classique dans les langages de la POO : public override string ToString() { return 1 chaîne de caractères représentant l’objet } Exemple : on redéfinit ToString() dans la classe Personne comme la suivante : public override string ToString() { return nomPre + " " + taille + " metre. On obtient l’exécution suivante : Informations de la premiere personne : Personne Informations de la deuxieme personne : Personne Press any key to continue b) Cas 2 : la classe redéfinit la méthode ToString() 1.1) Redéfinition de ToString() : a) Cas 1 : la classe ne dispose pas de ToString() C# remonte dans l’hiérarchie et applique la méthode ToString() d’une classe parente.8). 65. 1. Console. Personne pers2 = new Personne("Charbonneau Lise". Console.

Informations de 1.WriteLine("pers1 == pers2 vaut " + (pers1 == pers2)). l’objet 1 réfère vers la m^me zone de mémoire que l’objet 2 obj1 == obj2 ces deux objets réfèrent-ils vers la même zone de mémoire ? Avec pers1 et pers2 construits précédemment. nomPre. } Lors de l’exécution. 15} {1. 65.Format chaîne formatée. les deux instructions : pers1 = pers2.8 Informations de 1.9 Press any key to la premiere personne : Tremblay Pierre kg la deuxieme personne : Charbonneau Lise kg continue 2) Redéfinition de Equals (object obj): Entre deux objets : obj1 = obj2 . taille.8 Informations de 1.) Semaine 6 : Redéfinition de méthode + Révision pour l’intra 70 . nouveau style de C# (et de version 1. on obtient : Informations de 1.78 metre 65. Exemple pour retourner une public override string ToString() { return string.62 metre 58. 5:F1} kg". 58. 6:F2} metre {2. poids). Console.WriteLine("pers1 == pers2 vaut " + (pers1 == pers2)). font afficher : true IFT 1179.9 Press any key to la premiere personne : Tremblay Pierre kg la deuxieme personne : Charbonneau Lise kg continue 2.5 de Java) : On utilise la méthode string. affiche false Par contre.78 metre. l’instruction Console.Format("{0.62 metre. Automne 2005 (par Le Van N.

on utilise plutôt la méthode Equals : Dans object. Personne pers3 = new Personne("Tremblay Pierre". 65..) d’une classe parente.Equals(autre. return nomPre... il retourne la comparaison entre deux (au lieu de leurs contenus).nomPre.. 1.) a) version plus simple (cas de la classe Personne) public override bool Equals(object obj) { Personne autre = (Personne) obj. .ToUpper(). public bool Equals(object autre) a) Cas 1 : la classe ne dispose pas de Equals(. } L’exécution du codage précédent nous donne : IFT 1179.ToUpper()). Si C# applique cette object.Equals(pers2) vaut False pers1. Automne 2005 (par Le Van N. Console. méthode de références dans l’hiérarchie et applique la méthode .Equals(pers2)). On ajoute la troisième personne qui a le même contenu de la première personne : Console.78.Equals(pers2) vaut " + pers1. L’exécution donne : pers1.8).Equals(pers3) vaut False Press any key to continue Cas 2 : redéfinition de Equals(.) Semaine 6 : Redéfinition de méthode + Révision pour l’intra 71 .) C# remonte Equals(.WriteLine("pers1.Pour comparer le contenu de 2 objets.WriteLine("pers1.Equals(pers3)).Equals(pers3) vaut " + pers1. cette méthode compare selon la référence car les auteurs de cette méthode ne savent rien sur les classes créées plus tard pour comparter le contenu de deux objets.

2.Equals(pers2) vaut False pers1. Si obj1. obj1.Equals(unCercle) devrait retourner toujours False (objets incompatibles). Voici l’exemple de redéfinition de Equals dans la classe Station (des métros) : public override bool Equals (object obj) { if (this == obj) return true.Equals(obj3) vaut True alors obj1. return nom.) Semaine 6 : Redéfinition de méthode + Révision pour l’intra 72 .Equals(obj) retourne toujours True.Equals(pers3) vaut True Press any key to continue b) version plus détaillée : Les experts en POO suggèrent toujours de respecter : 1.ToUpper(). else { Station autre = (Station) obj.Equals(obj1) disposent toujours du même résultat 3.GetType()) // incomparable! return false.Equals(obj2) vaut True et obj2. // comparer à lui-même else if (obj. une comparaison du genre pers.Equals(autre.ToUpper()).nom. obj.pers1.Equals(obj3) vaut aussi True De plus. Automne 2005 (par Le Van N.Equals(obj2) et obj2. IFT 1179. } } Les méthodes de recherche séquentielle dans les collections (exemple Array) sont basées sur la redéfinition de Equals.GetType() != this.

WriteLine("pers1. this.Equals(pers3) vaut : False Press any key to continue */ IFT 1179. pers3 = new Personne("Arcand Pierre".nomPre = nomPre. Console.cs (aucune redéfinition) : /* Redefinition0. double poids) { this.75. Console.ToString()). // un constructeur public Personne(string nomPre. private double taille.Equals(pers3) vaut : " + pers1. pers2 = new Personne("Charbonneau Luc".89. private double poids.taille = taille.2).1. Console. this.WriteLine("pers1 = pers3 vaut : " + (pers1 == pers3)). } } /* Exécution: Infos de pers1 : Personne pers1 = pers3 vaut : False pers1.4).) Semaine 6 : Redéfinition de méthode + Révision pour l’intra 73 . 65.75. Automne 2005 (par Le Van N. using System.cs * Pas de redénition de ToString ni de Equals * */ using System.Equals(pers3)). } // AUCUNE redéfinition } class Redefinition0 { static void Main(string[] args) { Personne pers1 = new Personne("Arcand Pierre". 65.poids = poids. double taille. class Personne { // champs (field) d'informations private string nomPre.Fichier : Redefinition0.1.4).WriteLine("Infos de pers1 : " + pers1.1. 76.IO.

using System. } } IFT 1179. 65.WriteLine("pers1 = pers3 vaut : " + (pers1 == pers3)). pers2 = new Personne("Charbonneau Luc". private double taille.1. private double poids. double taille.poids = poids.2).Equals(pers3)).IO. // un constructeur public Personne(string nomPre. } public override string ToString() { return nomPre + " " + taille + " metre.4). style simple) /* Redefinition1.Fichier : Redefinition1.WriteLine("pers1.75. this. Console.taille = taille. 65. pers3 = new Personne("Arcand Pierre".) Semaine 6 : Redéfinition de méthode + Révision pour l’intra 74 .nomPre.nomPre = nomPre. Automne 2005 (par Le Van N.ToUpper().cs * On redéfinit de ToString et de Equals * Style simple */ using System. } } class Redefinition0 { static void Main(string[] args) { Personne pers1 = new Personne("Arcand Pierre". double poids) { this. Console.cs (redéfinition. " + poids + " kg".89.ToString()).1. Console.1.75.ToUpper()).Equals ( ((Personne) obj). } public override bool Equals(object obj) { // version SIMPLE return nomPre.Equals(pers3) vaut : " + pers1. class Personne { // champs (field) d'informations private string nomPre. this.4). 76.WriteLine("Infos de pers1 : " + pers1.

/* Exécution: Infos de pers1 : Arcand Pierre 1. using System.taille = taille. 15} {1.cs (redéfinition. taille.nomPre. else return nomPre. } public override bool Equals(object obj) { if (this == obj) // comparer à lui-même return true.GetType() ) return false.cs * On redéfinit de ToString et de Equals * Style plus complet */ using System. double poids) { this.Format("{0.ToUpper(). 7:F1} kg". 6:F2} metre {2. nomPre. this.ToUpper()). else if ( this.Equals(pers3) vaut : True Press any key to continue */ Fichier:Redefinition2. class Personne { // champs (field) d'informations private string nomPre. Automne 2005 (par Le Van N.) Semaine 6 : Redéfinition de méthode + Révision pour l’intra 75 . } } IFT 1179.nomPre = nomPre. style plus complet) /* Redefinition2.IO. this.poids = poids.4 kg pers1 = pers3 vaut : False pers1. 65. double taille.Equals ( ((Personne) obj). // un constructeur public Personne(string nomPre.75 metre. private double poids. poids). private double taille.GetType() != obj. } public override string ToString() { return string.

65.Equals(pers3)).4). 65.4 kg ------------- FIN DE MATIÈRES D’INTRA ------- IFT 1179.ToString()).4).75.WriteLine("pers1 = pers3 vaut : " + (pers1 == pers3)).class Redefinition0 { static void Main(string[] args) { Personne pers1 = new Personne("Arcand Pierre". 76.75 metre 65.WriteLine("pers1. pers2 = new Personne("Charbonneau Luc".1. } } /* Exécution: Infos de pers1 : Arcand Pierre pers1 = pers3 vaut : False pers1.75. Console.) Semaine 6 : Redéfinition de méthode + Révision pour l’intra 76 .1.1.2). Automne 2005 (par Le Van N.Equals(pers3) vaut : " + pers1.Equals(pers3) vaut : True Press any key to continue */ 1.89. Console. Console. pers3 = new Personne("Arcand Pierre".WriteLine("Infos de pers1 : " + pers1.