Vous êtes sur la page 1sur 6

Universit Paris Diderot e Licence Informatique

Programmation Oriente Objet e Anne 2008-2009 e

TP n3 - Correction
Hritage e

Exercice 1 On modlise une application devant servir ` linventaire dune biblioth`que. Elle e a e devra traiter des documents de nature diverse : des livres, des dictionnaires, et autres types de documents quon ne conna pas encore prcisment mais quil faudra certainement ajouter un t e e jour (articles, bandes dessines...). Tous les documents poss`dent un numro denregistrement et e e e ` un titre. A chaque livre est associ, en plus, un auteur et un nombre de pages, les dictionnaires e ont, eux, pour attributs supplmentaires une langue et un nombre de tomes. On veut manipuler e tous les articles de la biblioth`que au travers de la mme reprsentation : celle dun document. e e e 1. Dnissez les classes Document, Livre et Dictionnaire. Dnissez pour chacune un e e constructeur permettant dinitialiser toutes ses variables dinstances.
Correction : public class Document { static private int numeroSuivant = 0; static private int getID() { return ++numeroSuivant; } private int numero; private String titre; public Document(String titre) { this.numero = getID(); this.titre = titre; } public int getNumero(){ return numero; } public String getTitre(){ return titre; } } public class Dictionnaire extends Document { private int nbTomes; private String langue; public Dictionnaire(String titre, int nbTomes, String langue) { super(titre); this.nbTomes = nbTomes; this.langue = langue; } public int getNombreDeTomes() { return nbTomes; } public String getLangue() { return langue; } } public class Livre extends Document{ private String auteur; private int nbPages;

public Livre(String titre, String auteur, int nbPages) { super(titre); this.nbPages = nbPages; this.auteur = auteur; } public String getAuteur() { return auteur; } public int getNombreDePages() { return nbPages; } }

2. Dnissez une classe Biblioth`que rduite ` une mthode main permettant de tester les e e e a e classes prcdentes (ainsi que les suivantes). e e
Correction : Par exemple : public class Bibliotheque{ public static void main(String[] argv){ Document d = new Document("Configurer son compte utilisateur"); Livre l = new Livre("La communication sous unix","J-M Rifflet",799); Dictionnaire di = new Dictionnaire("Man pages",4,"Anglais"); System.out.println(d.getTitre()) ; System.out.println(l.getTitre()) ; System.out.println(di.getTitre()) ; } }

3. Dnissez la classe ListeDeDocuments permettant de crer une liste vide de documents, e e puis y adjoindre une fonction permettant dajouter un document.
Correction : import java.util.Vector; public class ListeDeDocuments { private Vector<Document> lesDocuments; public ListeDeDocuments() { lesDocuments = new Vector<Document>(); } public void ajouteDocument(Document unDocument) { lesDocuments.addElement(unDocument); } }

4. Dans la classe ListeDeDocuments dnissez une mthode tousLesAuteurs() qui ache e e la liste des numros des documents de la liste avec, pour chacun, lventuel auteur. e e
Correction : public void tousLesAuteurs() { Document unDocument; for (int i=0; i<lesDocuments.size(); i++){ unDocument = lesDocuments.elementAt(i); System.out.print(unDocument.getNumero()); if (unDocument instanceof Livre) System.out.println( " " + ((Livre)unDocument).getAuteur()); else System.out.println() ; } }

5. Rednisez la mthode toString() dans la classe Document ainsi que dans les classes e e Livre et Dictionnaire et qui renvoie une cha de caract`res dcrivant un document, ne e e un livre ou un dictionnaire. Ajoutez alors dans la classe ListeDeDocuments une mthode e tousLesDocuments() qui ache conscutivement la description de tous les documents. e
Correction : Dans Document : public String toString() { return ("numero: "+numero+" titre: "+titre); } Dans Livre : public String toString(){ return (super.toString()+" auteur: "+getAuteur()+" pages: "+getNombreDePages()); } Dans Dictionnaire : public String toString() { return (super.toString()+" tomes: "+getNombreDeTomes()+" langue: "+getLangue()); } Dans ListeDeDocuments : public void tousLesDocuments() { Document unDocument; for (int i=0; i<lesDocuments.size(); i++){ unDocument = lesDocuments.elementAt(i); System.out.println(unDocument); } }

6. Proposez quelques lignes de codes ` ajouter ` la classe Bibliotheque an de tester la a a classe ListeDeDocuments.
Correction : public class Bibliotheque{ public static void main(String[] argv) { Document d = new Document("Configurer son compte utilisateur"); Livre l = new Livre("La communication sous unix","J-M Rifflet" ,799); Dictionnaire di = new Dictionnaire("Man pages",4,"Anglais"); System.out.println(d.getTitre()); System.out.println(l.getTitre()); System.out.println(di.getTitre()); ListeDeDocuments ld = new ListeDeDocuments(); ld.ajouteDocument(d); ld.ajouteDocument(l); ld.ajouteDocument(di); ld.tousLesAuteurs(); ld.tousLesDocuments(); } }

Dans lexercice suivant nous allons utiliser la classe FileWriter pour gnrer un chier. e e Pour lutiliser il faut limporter import java.io.FileWriter;. Dautre part, lutilisation des constructeurs de cette classe, peuvent gnrer des exceptions du type IOException. Il convient e e donc : 3

dimporter la classe IOException avec import java.io.IOException;, dajouter throws IOException a la dclaration des mthodes dans lesquelles nous utilisons ` e e FileWriter. Un cours et un TD seront consacrs ` la gestion des exceptions. e a Enn dirents constructeurs existent pour FileWriter. Nous allons utiliser le constructeur e prenant en argument une chaine de caract`res. Notez que cette cha de caract`res peut spcier e ne e e le chemin vers le dossier dans lequel nous voulons gnrer nos chiers. Par exemple : e e FileWriter w = new FileWriter(/local/home/monom/file); gn`re un chier file.txt vide dans mon dossier /local/home/monom/. e e Pour ecrire dans un tel chier, on utilise entre autres les mthodes : e write(String s) qui ecrit la cha s dans le chier, ne close() pour mettre n ` lcriture dans ce chier. a e Si vous utilisez write(String s), il est ncessaire de terminer lecriture du chier en utilisant e close(). Exercice 2 Utilisation de FileWriter. 1. Dans la classe ListeDeDocuments, dnissez une fonction sauvegarde permettant dcrire e e la liste des documents dans un chier.
Correction : public void sauvegarde(String filename) throws IOException { FileWriter w = new FileWriter(filename); Document unDocument; for (int i=0; i<lesDocuments.size(); i++){ unDocument = lesDocuments.elementAt(i); w.write(unDocument.toString()+ "\n"); } w.close(); }

2. Proposez quelques lignes de codes ` ajouter ` la classe Bibliotheque an de tester la a a mthode sauvegarde. e
Correction : ld.sauvegarde("monchemin/liste.txt);

Exercice 3 Ecrire trois classes Figure, Carre, et Rectangle, telles que : 1. Figure a des attributs abscisse et ordonne, ainsi quune couleur (encode par un entier). e e 2. Carre et Rectangle hritent de Figure, mais ont en plus une ou deux longueur pour les e cts. oe 3. Figure a un attribut priv Vector rfrenant toutes les instances de sa classe et de e ee c ses sous classes. 4. Figure a une mthode statique getInstances() renvoyant ce vecteur. e 5. Carre et Rectangle rednissent cette mthode getInstances() de mani`re ` ne rcuprer e e e a e e que les instances qui correspondent ` leur type. a
Correction : On dduira aisment une solution pour la classe Rectangle dune solution pour la classe e e Carre :

//Fichier Figure.java import java.util.Vector ; public class Figure { private static Vector instances = new Vector(); private int abscisse; private int ordonnee; private int couleur; public Figure( int abscisse , int ordonnee , int couleur ) { this.abscisse = abscisse; this.ordonnee = ordonnee; this.couleur = couleur; instances.add(this); } public static Vector getInstances() { return instances ; } public String toString(){ return (abscisse+" "+ordonnee+" "+couleur); } } public class Carre extends Figure { private int cote ; public Carre(int abscisse, int ordonnee, int couleur, int cote) { super(abscisse,ordonnee,couleur); this.cote = cote; } public static Vector getInstances() { int nCarre = 0; Vector instancesCarre = new Vector(); Vector instances = Figure.getInstances(); Enumeration e = instances.elements(); Figure uneFigure; while(e.hasMoreElements()) { uneFigure = (Figure)e.nextElement(); if (uneFigure instanceof Carre) instancesCarre.add(uneFigure); } return instancesCarre; } public String toString(){ return (super.toString()+" "+cote); } } //Fichier Test.java import java.util.Vector ; import java.util.Enumeration ; public class Test { public static void main(String[] argv) { Figure f1 = new Figure(1,1,1); Figure f2 = new Figure(2,2,2); Carre c3 = new Carre(3,3,3,3); Figure f4 = new Figure(4,4,4); Carre c5 = new Carre(5,5,5,5);

System.out.println("Liste des figures") ; Enumeration e = Figure.getInstances().elements() ; while(e.hasMoreElements()){ System.out.println(e.nextElement()) ; } System.out.println("Liste des carres") ; e = Carre.getInstances().elements() ; while(e.hasMoreElements()){ System.out.println(e.nextElement()) ; } } }