| | | | | | |
| --- | --- | --- | --- | --- | --- |
|  | TP N°7 Héritage / Polymorphisme Dérivations successives | | | |  |
| | | | | | |
| Objectifs | | | Temps alloué | | Outils |
| Se perfectionner dans les concepts d’héritage et de polymorphisme. Tester la notion de dérivations successives | | | 3h00 | | Eclipse |
Pour la gestion d’une bibliothèque on nous demande d’écrire une application traitant des documents de nature diverse : des livres, qui peuvent être des romans ou des manuels, des revues, des dictionnaires, etc.
Tous les documents ont un numéro d’enregistrement (un entier) et un titre (une chaîne de caractères). Les livres ont, en plus, un auteur (une chaîne) et un nombre de pages (un entier). Les romans ont éventuellement un prix littéraire (un entier conventionnel, parmi : GONCOURT, MEDICIS, INTERALLIE, etc.), tandis que les manuels ont un niveau scolaire (un entier). Les revues ont un mois et une année (des entiers) et les dictionnaires ont une langue (une chaîne de caractères convenue, comme "anglais", "allemand", "espagnol", etc.). Tous les divers objets en question ici (livres, revues, dictionnaires, romans, etc.) doivent pouvoir être manipulées en tant que documents.

1. Création des différentes classes
Nous avons d’abord décidé de faire un fichier par classe et donc chaque classe se trouve dans son fichier .java.
Nous avons alors écrit le corps de toutes les classes ci-dessus (Document, Livre, Roman, Manuel, Revue et Dictionnaire). Comme vous pouvez le voir sur le schéma de l’énoncé, il existe des liens d’héritage entre les classes à différents niveaux. Tout d’abord entre Document et Livre, Revue et Dictionnaire(1). Puis entre Livre et Roman et Manuel.
Il existe quelques caractéristiques essentielles à connaître au sujet de l’héritage. Prenons pour exemple le cas (1) :
- On définit une superclasse : Document
- On définit trois sous-classes pour Livre, Revue et Dictionnaire
- La superclasse définit les attributs et méthodes communes
- Les sous-classes héritent des attributs et des méthodes de la superclasse. Ainsi Revue hérite des attributs titre et numEnreg
- Les sous-classes ajoutent leurs propres attributs et méthodes
Publicité
Dans chacune de ces classes nous avons défini :
- le constructeur qui prend autant arguments qu’il y a de variables d’instance et qui se limite à initialiser ces dernières avec les valeurs des arguments
- une méthode public String toString() produisant une description sous forme de chaîne de caractères des objets
- Des « accesseurs » publics get... permettant de consulter les valeurs des variables d’instances (déclarés en private)
A ce niveau, nous avons en notre possession les six classes écrites au complet. Pour tester le travail effectué, nous avons écrit une classe exécutable TestDocuments (présent dans le fichier TestDocument.java) qui crée et affiche plusieurs documents de types différents dont voici le résultat de l’exécution :

1. La classe Bibliotheque
Une bibliothèque sera représentée par un tableau de documents (on verra un autre jour de meilleures manières de faire, basées sur l’emploi d’une Collection).
C’est ainsi que nous avons défini une classe Bibliotheque, avec un tel tableau pour variable d’instance :
protected Document[] document;
protected int nombre;
Et possédant les méthodes suivantes:
- Bibliotheque(int capacité) - constructeur qui crée une bibliothèque ayant la capacité
(nombre maximum de documents) indiquée
- void afficherDocuments() - affiche tous les ouvrages de la bibliothèque
- Document document(int i) - renvoie le ième document
- boolean ajouter(Document doc) - ajoute le document indiqué et renvoie true (false en cas d’échec)
- boolean supprimer(Document doc) - supprime le document indiqué et renvoie true (false en cas d’échec)
- void afficherAuteurs() - affiche la liste des auteurs de tous les ouvrages qui ont un auteur (au besoin, utilisez l’opérateur instanceof)
Nous utilisons dans la dernière méthode, le mot clé instanceof qui s’utilise comme suit :
Publicité
nomObjet instanceof nomClasse
Opérateur de comparaison qui retourne true si l'objet nomObjet est une instance de la classe nomClasse ou de l'une de ses classes filles.
Une fois ces méthodes créées, nous avons écrit la méthode main afin de pouvoir tester toutes ces méthodes :
Bibliotheque Bibliotheque = new Bibliotheque(50); // Déclaration d’une nouvelle bibliothèque de 50 éléments
Document unDocument = new Roman("A. Metral", "Compte rendu du TP2", 20, 1003, Roman.GONCOURT);
Bibliotheque.ajouter(new Document(1001, "Je n'ai plus d'idee"));
Bibliotheque.ajouter(new Livre("Y. Rolognese ", "Nicolas Sarkozy, le manuel vaudou", 1002, 500));
Bibliotheque.ajouter(unDocument);
Bibliotheque.ajouter(new Manuel("A. Metral-Boitel", "Vive le Java", 200,1004, 2));
Bibliotheque.ajouter(new Revue("Science et Vie", 4, 2008, 1005));
Bibliotheque.ajouter(new Dictionnaire(Dictionnaire.FRANCAIS, "Larousse", 1006));
System.out.println("--------------DOCUMENTS---------------------");
Bibliotheque.afficherDocuments();
System.out.println("-------------------------------------------");
Publicité
System.out.println("---------------AUTEURS----------------------");
Bibliotheque.afficherAuteurs();
System.out.println("----------------END-------------------------");
System.out.println("-----DOCUMENTS SANS LE NUM 1003-------------");
Bibliotheque.supprimer(unDocument);
Bibliotheque.afficherDocuments();
System.out.println("----------------------END------------------");
Cette méthode devra créer une bibliothèque de 50 éléments, créer un nouveau Roman et ajouter plusieurs documents à cette bibliothèque. Ensuite nous affichons son contenu en deux morceaux : Tout d’abord les documents en entier, puis le nom des auteurs.
Nous testons ensuite la méthode boolean supprimer(Document Doc) en enlevant de cette bibliothèque le Roman crée au départ. Nous réaffichons encore une fois le contenu de la bibliothèque afin d’observer ou non, le changement.
Nous obtenons bien le résultat désiré :

1. La classe Livrotheque
Nous avons défini une classe Livrotheque dont les instances ont les mêmes fonctionnalités que les Bibliotheques mais sont entièrement constituées de livres.
Cette classe hérite des attributs et des méthodes de la classe Bibliotheque.
Publicité
Elle possède un constructeur qui prend comme argument la capacite et les méthodes suivantes :
- public boolean ajouter(Document doc)
- public Livre livre(int i)
- public void afficherAuteurs()
L’écriture de cette classe nous oblige à modifier la classe Bibliotheque pour déclarer en protected les membres privés (sinon, les accès à document et à nombre sont trouvés illégaux) :

public class Bibliotheque {
protected Document[] document;
protected int nombre; ...
Le rôle principal de la classe Livrotheque est de garantir que seuls des livres figurent dans le tableau docs sous-jacent. Une possibilité serait d’écrire :
public boolean ajouter(Livre doc) {
return super.ajouter(doc);
}
Mais cette méthode n’ajoute que des livres, mais elle n’est pas une redéfinition de la méthode ajouter(Document doc) héritée, qui reste donc utilisable à côte de ajouter(Document doc) (cela s’appelle la surcharge). Le polymorphisme constituant un concept majeur de la programmation orientée objet, la surcharge (overload) des méthodes est l'une des représentantes de cette particularité dans le langage Java. Si deux méthodes possèdent un nom semblable mais différentes signatures, le nom de ces méthodes est dit surchargé.