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 :
- lancer eclipse (version Oxygen) ;
- indiquer comme workspace le répertoire dans
lequel vous travaillerez. Il est recommandé d'utiliser
différents espaces de travail selon l'activité (TD AO, Projet
...). Par exemple, utilisez ~/espaces/travail/AO/workspace.
- créer un projet Formes. Vérifier dans le
dialogue que le JRE utilisé est bien la version 8.
- y inclure un paquetage formes.
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 :
- une translation de vecteur (x,
y),
- une translation positionnant le centre de gravité en un point
P donné,
- des changements de taille
en fonction de la forme considérée
API Java, méthodes héritées de Object, encapsulation
- 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.
- On considère la classe Rectangle
ci-jointe. Ajouter
- 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.
- deux méthodes (accesseurs) renvoyant les données hauteur et
largeur ;
- 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
- 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.
- 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();
- Rajouter une méthode (accesseur) permettant de récupérer
le centre de gravité.
Héritage et Délégation
- Écrire une classe Cercle sur le même modèle que
la classe Rectangle.
- Quel problème constatez-vous sur la classe Cercle
? Proposer une solution.
- É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.
- Écrire une classe Carre. Quelles peuvent être les
relations entre cette classe et la classe Rectangle
?
- 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
- 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 :
- on peut supprimer une entrée dans la table en enlevant
directement un élément de l'ensemble retourné par keySet();
- il n'est pas possible de rajouter un élément dans l'ensemble
retourné par keySet()car
cela rajouterais une clé sans valeur associée.
- 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.
- 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.