Approche Objet - TD1 : Formes

Eclipse

Pour l'ensemble des TP, eclipse est l'environnement de développement préconisé. Nous vous invitons dès à présent à vous référer à la documentation sur le site officiel www.eclipse.org mais également aux nombreux tutoriels disponibles sur Internet pour prendre en main cet outil.
Pour configurer correctement votre environnement pour ce premier TP, vous devez :
On souhaite écrire un programme pour manipuler des formes géométriques :
on doit disposer de méthodes donnant leur périmètre, leur surface, leur centre de gravité.
on doit pouvoir leur appliquer différentes transformations géométriques :

API Java, méthodes héritées de Object, encapsulation

  1. Chercher dans l'API Java (http://docs.oracle.com/javase/8/docs/api/) les classes relatives aux points. Comprendre et justifier l'arborescence des classes.
  2. On considère la classe Rectangle ci-jointe. Ajouter
    1. une classe TestFormes dans le paquetage "par défaut" testant la classe Rectangle. Vous modifierez cette classe tout au long du TD pour tester vos réponses.
    2. deux méthodes (accesseurs) renvoyant les données hauteur et largeur ;
    3. une méthode permettant d'afficher, lorsque l'on utilise l'instruction System.out.print(r) où r est une instance de Rectangle de centre (10, 20), de largeur 40 et de hauteur 30 le résultat :
      Rectangle de centre (10.0, 20.0) de largeur 40.0 et hauteur 30.0
    4. une méthode testant si deux rectangles sont égaux et renvoyant true s'ils ont les mêmes centres de gravité, hauteur et largeur.
      Vérifier que l'instruction Objects.equals(r1, r2) renvoit bien true si r1 et r2 sont deux rectangles de mêmes centres de gravité, hauteur et largeur.
      Quelle méthode doit-on également redéfinir ? En donner une implémentation.
  3. Expliquer pourquoi il est important de faire une copie du point passé en paramètre du constructeur grâce à l'utilisation de la méthode clone()dans l'instruction
    centreGravite = (Point2D) p.clone();
  4. Rajouter  une méthode (accesseur) permettant de récupérer le centre de gravité.

Héritage et Délégation

  1. Écrire une classe Cercle sur le même modèle que la classe Rectangle.
  2. Quel problème constatez-vous sur la classe Cercle ? Proposer une solution.
  3. Écrire une classe Formes possédant une méthode de classe afficher qui affiche une forme en utilisant la méthode toString() de celle-ci (affichage de ses caractéristiques sur la sortie standard). Quel problème constatez-vous ? Proposer une solution.
  4. Écrire une classe Carre. Quelles peuvent être les relations entre cette classe et la classe Rectangle ?
  5. On souhaite maintenant colorer les formes avec une couleur de fond et une couleur d'encre. Comment rajouter ce service sans modifier le code existant et en évitant toute duplication ?

Vue

  1. Regarder l'interface Map de l'API Java et commenter l'utilisation de la méthode keySet(). Écrire une classe de test montrant les conséquences de l'utilisation d'une vue plutôt qu'une copie :
  2. Dans le projet Formes, rajouter une méthode privée messageBouger() qui affiche un message "Je bouge en x,y" et qui devra être appelée à chaque mouvement d'une forme. 
  3. On souhaite remplacer le clonage du point dans le renvoi du centre de gravité par l'usage d'une vue. Cela signifie que tout action sur le point renvoyé aura un effet sur le centre de gravité de la forme. Rappelez le concept de vue et proposez une solution qui conserve la contrainte de la question précédente.