Université Paris 7 Programmation objet IUP2 Année 2004-2005 TP n 5 - Correction Héritage Exercice 1 Le cas d école modifié 1. Ecrivez une classe Figure. Cette classe a des attributs privés abcisse et ordonnée, ainsi qu une couleur. Les couleurs seront représentées par des objets de la classe java.awt.color. Le constructeur de la classe instanciera chaque attribut privé. Des méthodes publiques permettront d accéder aux valeurs de ces attributs. Vous regarderez la documentation de la classe java.awt.color pour choisir la constante correspondant à votre couleur préférée pour faire un test de votre classe. //Fichier Figure.java public class Figure{ private int abcisse ; private int ordonnee ; private Color couleur ; public Figure(int abcisse, int ordonnee, Color couleur){ this.abcisse = abcisse ; this.ordonnee = ordonnee ; this.couleur = couleur ; public Color getcolor(){ return couleur ; public int getabcisse(){ return abcisse ; public int getordonnee(){ return ordonnee ; return ("abcisse: " + abcisse + " ordonnee: " + ordonnee + " couleur: " + couleur) ; 2. Ecrivez deux classes Cercle et Rectangle qui héritent de Figure. Cercle a un attribut rayon et Rectangle a des attributs hauteur et longueur. Comme d habitude, testez vos classes. //Fichier Cercle.java public class Cercle extends Figure{ private int rayon ; 1
public Cercle( int abcisse, int ordonnee, Color couleur, int rayon ){ super( abcisse, ordonnee, couleur ) ; this.rayon = rayon ; public int getrayon(){ return rayon ; return ( super.tostring() + " rayon: " + rayon ) ; //Fichier Rectangle.java public class Rectangle extends Figure{ private int hauteur ; private int longueur ; public Rectangle( int abcisse, int ordonnee, Color couleur, int hauteur, int longueur ) super( abcisse, ordonnee, couleur ) ; this.hauteur = hauteur ; this.longueur = longueur ; public int gethauteur(){ return hauteur ; public int getlongueur(){ return longueur ; return ( super.tostring() + " hauteur: " + hauteur + " longueur: " + longueur ) ; 3. Ajoutez à Figure une variable de classe privée Vector qui devra référencer toutes les instances de sa classe et de ses sous classes. Comment allez vous remplir ce vecteur? Vous définirez également une méthode publique getinstances() qui permettra d accéder à ce vecteur. //Fichier Figure.java public class Figure{ private static Vector instances = new Vector() ; private int abcisse ; private int ordonnee ; private Color couleur ; public Figure(int abcisse, int ordonnee, Color couleur){ this.abcisse = abcisse ; this.ordonnee = ordonnee ; this.couleur = couleur ; instances.add(this) ; 2
public Color getcolor(){ return couleur ; public int getabcisse(){ return abcisse ; public int getordonnee(){ return ordonnee ; return ("abcisse: " + abcisse + " ordonnee: " + ordonnee + " couleur: " + couleur) ; 4. Cercle et Rectangle redéfinissent cette méthode getinstances() de manière à ne récupérer que les instances qui correspondent à leur type. Il n est pas nécessaire d ajouter un attribut à ces classes ou de modifier leur constructeur. On déduira aisément une solution pour la classe Cercle d une solution pour la classe Rectangle : public static Vector getinstances(){ Vector instancesrectangle = new Vector() ; Vector instances = Figure.getInstances() ; // static pas de super Enumeration e = instances.elements() ; Figure unefigure ; while( e.hasmoreelements()){ unefigure = (Figure) e.nextelement() ; if (unefigure instanceof Rectangle) instancesrectangle.add(unefigure) ; return instancesrectangle ; //Fichier Test.java import java.util.enumeration ; public class Test{ public static void main(string[] argv){ Figure f1 = new Figure(1,1,Color.cyan) ; Figure f2 = new Figure(2,2,Color.cyan) ; Rectangle c3 = new Rectangle(3,3,Color.cyan,3,12) ; Figure f4 = new Figure(4,4,Color.cyan) ; Rectangle c5 = new Rectangle(5,5,Color.cyan,5,10) ; System.out.println("Liste des figures") ; Enumeration e = Figure.getInstances().elements() ; System.out.println(e.nextElement()) ; System.out.println("Liste des Rectangles") ; e = Rectangle.getInstances().elements() ; System.out.println(e.nextElement()) ; 3
Exercice 2 Jouer avec les Applets À côté des applications autonomes qui peuvent être lancées au travers d une JVM par la commande java, il est possible de développer des applications qui seront exécutées sous le contrôle d un navigateur Internet (par exemple netscape ou explorer, ou l application appletviewer) Les applets sont référencées dans les pages HTML sous la forme : <APPLET CODE = Classe.class WIDTH=xxx HEIGHT =xxx> </APPLET> Un applet est une instance d une sous-classe publique de la classe Applet. Pour l utiliser il vous faudra importer java.applet.applet. Cette classe est elle-même une sous classe de la classe Panel qui est un conteneur graphique : cela a pour conséquence immédiate qu une applet dispose d une interface graphique. Contrairement à ce qui se passe pour une application autonome, la définition d un applet ne contient pas de méthode main. Lorsqu une demande d exécution d un applet est formulée, la classe de l applet est automatiquement instanciée avec le constructeur par défaut et la méthode init de cette instance est invoquée. Cette méthode signale que l applet a été chargé. La méthode start est invoquée à son tour par le navigateur. Cela a pour effet de rendre l application active. L invocation de la méthode paint(graphics g) assure la réactualisation du contexte graphique de l applet. Elle sera appelée à chaque fois qu il est nécessaire de redessiner le contenu de l applet (lancement de l applet, redimensionnement du navigateur par exemple). C est cette méthode que nous allons surcharger pour faire de beaux dessins... Pour cela, nous utiliseront les méthodes de la classe Graphics, que vous pourrez appeler à condition d importer java.awt.graphics. Ouvrez d ores et déjà la documentation de cette classe. 1. Créez une classe FigureGraphique qui étend la classe Applet.. Vous redéfinirez la méthode paint : celle ci devra afficher le texte Bonjour le Monde! à l aide de la méthode drawstring de la classe Graphics. Compilez ce fichier à l aide de javac. 2. Créez un fichier d extension html contenant le code permettant d invoquer l applet FigureGraphique. Vous pouvez par exemple y mettre le code suivant : <HTML> <HEAD> <TITLE> Mon oeuvre d art </TITLE> </HEAD> <APPLET CODE = FigureGraphique.class WIDTH=400 HEIGHT =400> </APPLET> 3. Vous pouvez évaluer vos qualités artistiques en exécutant l applet : vous pouvez utiliser pour cela l outil appletviewer ou votre navigateur préféré avec votre fichier html. Dans le cas ou vous utilisez un navigateur, forcez le rechargement de l image car des paramètres de cache peuvent vous empêcher de voir les différences entre deux exécutions de l applet. 4
4. Cherchez dans la documentation de la classe Graphics les méthodes qui vous permettront de dessiner des cercles et des rectangles de couleur. Modifiez votre classe FigureGraphique. Un attribut vecteur de Figure (exercice précédent) sera initialisé par le constructeur avec des cercles et des rectangles. La méthode paint permettra de les dessiner à l écran. import java.awt.graphics ; import java.applet.applet ; import java.util.enumeration ; public class FigureGraphique extends Applet{ private Vector figures ; public FigureGraphique(){ figures = new Vector() ; figures.add(new Rectangle(100,100,Color.cyan,75,50)) ; figures.add(new Rectangle(200,100,Color.green,50,75)) ; figures.add(new Cercle(100,200,Color.red,50)) ; figures.add(new Cercle(200,200,Color.pink,50)) ; public void paint(graphics g){ g.drawstring("salut le monde!",50,50) ; Enumeration e = figures.elements() ; Figure f ; f = (Figure) e.nextelement() ; if (f instanceof Cercle){ g.setcolor(f.getcouleur()) ; int r = ((Cercle) f).getrayon() ; g.filloval(f.getabcisse(), f.getordonnee(), r, r) ; if (f instanceof Rectangle){ g.setcolor(f.getcouleur()) ; g.fillrect(f.getabcisse(), f.getordonnee(), ((Rectangle) f).gethauteur(), ((Rectangle) f).getlongueur()) ; 5