Exercice affichage et comparaison d'objets - toString, equals
Rédigé par Salim KHALIL, Publié le 17 Août 2010, Mise à jour le Lundi, 31 Août 2020 18:25Participez au vote ☆☆☆☆☆★★★★★
But:
Définition des méthodes toString et equals dans une hiérarchie de classes
Thème:
toString, equals
Programmer la hiérarchie de classes "Rectangle coloré héritant de Rectangle" (vue en cours) en obéissant aux contraintes suivantes :
- La classe Rectangle possède les attributs double largeur et hauteur.
- La classe RectangleColore hérite de Rectangle et possède un attribut couleur de type String
- Le code résultant doit pouvoir être testé avec le programme principal suivant :
-
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
class ToStringEq { public static void main(String[] args) { System.out.println("Test 1 :"); Rectangle rect = new Rectangle(12.5, 4.0); System.out.println(rect); System.out.println(); System.out.println("Test 2: "); // le type de rect1 est RectangleColore // l'objet contenu dans rect1 est de type RectangleColore RectangleColore rect1 = new RectangleColore(12.5, 4.0, "rouge"); System.out.println(rect1); System.out.println(); System.out.println("Test 3 :"); // le type de rect2 est Rectangle // l'objet contenu dans rect2 est de type RectangleColore Rectangle rect2 = new RectangleColore(25.0/2, 8.0/2, new String("rouge")); System.out.println(rect2); System.out.println (rect1.equals(rect2)); // 1. System.out.println (rect2.equals(rect1)); // 2. System.out.println(rect1.equals(null)); // 3. System.out.println (rect.equals(rect1)); // 4. System.out.println (rect1.equals(rect)); // 5. } }
- et produire alors la sortie :
Test 1 : Rectangle : largeur = 12.5 hauteur = 4.0 Test 2: Rectangle : largeur = 12.5 hauteur = 4.0 couleur = rouge Test 3 : Rectangle : largeur = 12.5 hauteur = 4.0 couleur = rouge true true false false false
- Les méthodes toString et equals nécessaires ne doivent pas comporter de duplication de code.
Fichiers:
ToStringEq.java
Les méthodes toString et equals redéfinissent (masquent) celles héritées de Object. Les tests fournis montrent qu'elles fonctionnent de façon polymorphique (affichage de rect2 et ligne commentée .2 dans la séquence "Test 3 :"). Les points auxquels il fallait être attentifs sont commentés dans la solution ci-dessous :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
class ToStringEq { public static void main(String[] args) { System.out.println("Test 1 :"); Rectangle rect = new Rectangle(12.5, 4.0); System.out.println(rect); System.out.println(); System.out.println("Test 2: "); // le type de rect1 est RectangleColore // l'objet contenu dans rect1 est de type RectangleColore RectangleColore rect1 = new RectangleColore(12.5, 4.0, "rouge"); System.out.println(rect1); System.out.println(); System.out.println("Test 3 :"); // le type de rect2 est Rectangle // l'objet contenu dans rect2 est de type RectangleColore Rectangle rect2 = new RectangleColore(25.0/2, 8.0/2, new String("rouge")); System.out.println(rect2); System.out.println (rect1.equals(rect2)); // 1. System.out.println (rect2.equals(rect1)); // 2. System.out.println(rect1.equals(null)); // 3. System.out.println (rect.equals(rect1)); // 4. System.out.println (rect1.equals(rect)); // 5. } } class Rectangle { private double largeur; private double hauteur; public Rectangle(double uneLargeur, double uneHauteur) { largeur = uneLargeur; hauteur = uneHauteur; } public boolean equals(Object autreRect) { // permet de passer correctement la ligne commentée .3 du test 3: if (autreRect == null) return false; else // garantit que l'on compare bien des // objet de même classe if (autreRect.getClass() != getClass()) return false; else { // procède à la comparaison attribut par // attribut return ( // Ne pas oublier le transtypage ici (largeur == ((Rectangle)autreRect).largeur) && hauteur == ((Rectangle)autreRect).hauteur); } } public String toString() { return "Rectangle : \n " + "largeur = " + largeur + "\n hauteur = " + hauteur; } } class RectangleColore extends Rectangle { private String couleur; public RectangleColore(double uneLargeur, double uneHauteur, String uneCouleur) { super(uneLargeur, uneHauteur); couleur = uneCouleur; } public boolean equals(RectangleColore autreRectColore) { if (autreRectColore == null){ return false; } else if (autreRectColore.getClass() != getClass()) { return false; } else { // Réutilisation du equals de la super-classe // pour éviter toute duplication de code return (super.equals(autreRectColore) && couleur.equals(autreRectColore.couleur) ); } } public String toString() { // Réutilisation de toString de la super-classe // pour éviter toute duplication de code return (super.toString() + "\n couleur = " + couleur); } } |