programmation Java (école d'ingénieur) · Chapitre 9 · Exercice de TD
Une égalité qui n'est pas symétrique
Héritage et polymorphisme · niveau 3 (difficile)
Énoncé
La classe P (un point) définit
@Override public boolean equals(Object o) {
return o instanceof P a && x == a.x && y == a.y;
}
et sa sous-classe PC (un point coloré) ajoute un attribut couleur et redéfinit
@Override public boolean equals(Object o) {
return o instanceof PC a && super.equals(a) && couleur.equals(a.couleur);
}
- Avec
P p = new P(1, 2)etPC q = new PC(1, 2, "rouge"), que valentp.equals(q)etq.equals(p)? Quelle propriété du contrat est violée ? - Pourquoi est-ce grave pour une collection ? Proposer une correction.
Corrigé
- L'exécution donne
true false:p.equals(q)est vrai (qest unP, mêmes coordonnées), maisq.equals(p)est faux (pn'est pas unPC). La symétrie est violée. - Une collection peut appeler
a.equals(b)oub.equals(a)selon l'ordre dans lequel les éléments ont été ajoutés : un ensemble pourrait alors contenir, ou non, « deux fois le même point » selon cet ordre. Une correction consiste à exiger que les deux objets soient de la même classe :
@Override public boolean equals(Object o) {
if (o == null || getClass() != o.getClass()) return false;
P a = (P) o;
return x == a.x && y == a.y;
}
(et de même dans PC, en comparant aussi la couleur). Un point et un point coloré ne sont alors jamais égaux, dans un sens comme dans l'autre. Une autre solution est la composition : un PC a un P et une couleur, et n'hérite pas de P.
100 % gratuit
La suite du chapitre est sur Adloun
- 10 autres exercices corrigés dans ce chapitre
- Les 2 QCM du chapitre, le premier sans compte
- Le podcast et la vidéo du chapitre : 2 minutes d'écoute sans compte
- Le tuteur, qui guide pas à pas sans donner la réponse
Sans compte : le cours, le premier QCM et 2 minutes de podcast et de vidéo. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.