Adloun

programmation Java (école d'ingénieur) · Chapitre 9 · Application directe du cours

Un carré est-il un rectangle ?

Héritage et polymorphisme · niveau 3 (difficile)

Énoncé

Une classe Rect possède les méthodes setLargeur, setHauteur et aire. On écrit class Carre extends Rect, dont les méthodes setLargeur et setHauteur modifient les deux côtés pour que le carré reste un carré.

  • Une méthode elargir(Rect r), écrite pour des rectangles, double la largeur de r et s'attend à ce que l'aire double. Que se passe-t-il si on lui passe un carré ?
  • Qu'en conclure sur la relation « un carré est un rectangle » en programmation ? Proposer une conception qui évite le problème.

Corrigé

  • On écrit elargir en calculant l'aire attendue :

static void elargir(Rect r) {           // écrite pour des rectangles
    double attendue = 2 * r.aire();     // doubler la largeur double l'aire
    r.setLargeur(r.getLargeur() * 2);
    System.out.println("aire attendue " + attendue + ", obtenue " + r.aire());
}

Appelée sur new Rect(2, 3) puis sur new Carre(3) :


aire attendue 12.0, obtenue 12.0
aire attendue 18.0, obtenue 36.0

Pour le carré, setLargeur(6) a aussi changé la hauteur : l'aire a été multipliée par , et non par . La méthode elargir, juste pour tous les rectangles, devient fausse pour un carré.

  • En géométrie, un carré est un rectangle ; mais un carré modifiable ne se comporte pas comme un rectangle modifiable : il ne tient pas la promesse « changer la largeur ne change pas la hauteur ». Un objet de la sous-classe doit pouvoir remplacer partout un objet de la super-classe (c'est le principe de substitution de Liskov). Solutions : rendre les formes immuables (sans setLargeur ; Carre peut alors hériter de Rect sans danger), ou faire de Carre et Rect deux sous-classes indépendantes de Forme.

100 % gratuit

La suite du chapitre est sur Adloun

Exercice suivant et tuteur

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.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant et tuteur →