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 :
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); } }