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