:: Enseignements :: Licence :: L3 :: 2010-2011 :: Programmation Objet avec Java ::
[LOGO]

5. Héritage, mutabilité, redéfinition, polymorphisme, varargs


Ce TD dure 2 séances !

À partir de ce TD nous allons utiliser un environnement de développement (IDE) un peu meilleur qu'un simple éditeur. Il existe Eclipse (ex-IBM) et NetBeans (ex-SUN). Eclipse est plus orienté code avec moins de wizards que Netbeans mais le compilateur vous transmet plus de warnings (ce qui est mieux).

Ces deux environnements compilent le code à la volée et génèrent le bytecode lorsque l'on sauve le fichier (avec ctrl+s). Ils complètent le code automatiquement (n'importe où, même dans le commentaire) avec ctrl+espace.

En terme d'organisation des fichiers sur le disque, les deux IDE utilisent le principe d'un espace de travail qui est un répertoire contenant un ensemble de projets. Un projet est aussi un répertoire contenant un ensemble de fichiers source (dans le répertoire src) et de classes. Sous Eclipse, par défaut, le répertoire contenant les classes s'appelle bin mais on peut le changer dans les préférences (Window > Preferences > Java > Build Path > Folders) pour l'appeller classes.

Cette année nous nous contenterons d'utiliser Eclipse pendant les TDs. Pour le projet ou chez vous, à vous de choisir. L'année prochaine, vous utiliserez de toute façon les deux (l'un ou l'autre en fonction de ce que l'on veut faire).

Exercice 1 - Eclipse

On verra la suite des fonctionnalités de ces environnements au fur et à mesure.

Exercice 2 - Point

Nous reprenons la classe fr.umlv.geom.Point de l'exercice précédent.

  1. Pourquoi la méthode toString() utilise-t-elle l'annotation @Override ?
  2. On souhaite ajouter une méthode translate permettant de translater un point.
    Discuter des choix d'implantation et de leurs influences sur la signature de la méthode translate.
  3. Écrire le code de la méthode translate de la solution retenue.
    Bien entendu vous testerez le code de translate dans la classe fr.umlv.geom.main.Main.

Exercice 3 - Circle

Pour tout l'exercice, pour vos tests, vous écrirez votre code dans la classe Main vue précédemment.
Ecrire une classe fr.umlv.geom.Circle, un cercle étant défini par un point correspondant au centre et un rayon.
  1. Ecrire le constructeur du Circle.
  2. Ecrire la méthode toString qui affiche le centre et le rayon. Ne pas oublier ce qu'il ne faut pas oublier.
  3. Ecrire la méthode translate(int dx,int dy) qui translate le cercle.
  4. Qu'affiche le code suivant sur la console ?
           Point p=new Point(1,2);
           Circle c=new Circle(p,1);
    
           Circle c2=new Circle(p,2);
           c2.translate(1,1);
    
           System.out.println(c+" "+c2);
          

    Que doit-on faire pour que cela n'arrive pas ?
  5. Quel est le problème avec l'accesseur getCenter() codé de la façon suivante ?
    	   public Point getCenter() {
    	     return center;
    	   }
    	  

    Pour vous aider, regardez le code suivant :
    	  Circle c=new Circle(new Point(1,2), 1);
    	  c.getCenter().translate(1,1);
    	  System.out.println(c);
    	 
    Que doit-on faire pour que le code soit correct ?
  6. Ecrire la méthode equals() qui renvoie vrai si deux cercles ont le même centre et le même rayon.
    Rappel : cette méthode existe déjà dans java.lang.Object.
  7. Ecrire la méthode surface() qui renvoie la surface du disque.
    Modifier la méthode toString pour qu'elle affiche aussi la surface.
  8. Ecrire la méthode contains(Point p) qui renvoie vrai si un point est contenu dans un disque.
  9. Ecrire la méthode contains(Point p, Circle... circles) qui renvoie vrai si un point est contenu dans un des disques.

Exercice 4 - One Ring for ...

Le but de cet exercice est de construire un anneau comme étant un cercle dont on a évidé une zone circulaire définie par son rayon interne.

Pour tout l'exercice, pour vos tests, réutilisez la classe Main vue précédemment.
  1. Rappeler dans un premier temps dans quel cas il est judicieux de faire de l'héritage.
  2. Ecrire la classe Ring qui hérite de la classe Circle.
  3. Ecrire un constructeur de la classe Ring prenant en paramètres un centre, un rayon et un rayon interne. Faire attention à ce que le rayon interne soit inférieur au rayon de l'anneau.
    Note: Tous les champs doivent être privés.
  4. Ecrire la méthode equals() qui teste l'égalité de deux anneaux.
  5. On souhaite afficher un anneau (centre, rayon, surface, rayon interne). Quel est le problème avec le code suivant ?
          Ring r=...
          System.out.println(r);
         
    Que doit-on faire pour le corriger ?

Ensuite,
  1. implanter une méthode contains(Point) en évitant d'allouer des objets ou de dupliquer du code
    NB : il existe deux solutions dont une plus élégante que l'autre.
  2. écrire la méthode contains(Point p, Ring... rings) qui renvoie vrai si un point est contenu dans un des anneaux.