TP N°7: Héritage / Polymorphisme — Dérivations Successives

Ce TP permet de se perfectionner dans les concepts d’héritage et de polymorphisme en Java, en mettant en œuvre des dérivations successives de classes. Il s’appuie sur la gestion d’une bibliothèque de documents variés (livres, revues, dictionnaires) et montre comment manipuler ces objets en tant que documents génériques.

D'après le document TP N°7: Héritage / Polymorphisme — Dérivations Successives

Cet article a été rédigé automatiquement à partir du document source, puis vérifié avant publication.

TP N°7: Héritage / Polymorphisme — Dérivations Successives

Document source

TP N°7: Héritage / Polymorphisme — Dérivations Successives

Programming (Java Object-Oriented Principles) · DOCX · 5 pages · 2008

Consulter le document original →

Ce TP permet de se perfectionner dans les concepts d’héritage et de polymorphisme en Java, en mettant en œuvre des dérivations successives de classes. Il s’appuie sur la gestion d’une bibliothèque de documents variés (livres, revues, dictionnaires) et montre comment manipuler ces objets en tant que documents génériques. Pour réaliser ce TP, il est nécessaire de disposer de l’environnement Eclipse et de connaissances de base en programmation orientée objet en Java.

Objectifs

  • Comprendre et appliquer les concepts d’héritage en Java.
  • Mettre en œuvre le polymorphisme avec des classes dérivées.
  • Tester la notion de dérivations successives à travers une hiérarchie de classes.
  • Manipuler des collections d’objets polymorphes.

Prérequis et configuration

  • Environnement de développement Eclipse.
  • Connaissances en programmation orientée objet (classes, héritage, méthodes, attributs).
  • Notions de base sur les tableaux et les collections en Java.
  • Fichiers source Java pour les classes Document, Livre, Roman, Manuel, Revue, Dictionnaire, Bibliotheque, Livrotheque et TestDocuments.

Création des différentes classes

Dans cette étape, vous devez créer un fichier .java par classe, en respectant la hiérarchie suivante :

  • Document : superclasse contenant les attributs communs numEnreg (int) et titre (String).
  • Livre, Revue, Dictionnaire : sous-classes directes de Document.
  • Roman et Manuel : sous-classes de Livre.

Chaque classe doit définir :

  • Un constructeur prenant en argument toutes les variables d’instance et initialisant ces dernières.
  • Une méthode public String toString() qui retourne une description textuelle de l’objet.
  • Des accesseurs get... publics pour consulter les variables d’instance, qui sont déclarées en private.

Par exemple, la classe Revue hérite de Document et possède en plus les attributs mois et annee (entiers).

Les constantes pour les prix littéraires dans Roman sont définies comme des entiers (ex. GONCOURT, MEDICIS, INTERALLIE).

Une fois toutes les classes codées, compilez-les et créez la classe exécutable TestDocuments pour tester la création et l’affichage d’objets de types différents. Le résultat attendu est une liste descriptive des documents créés.

La classe Bibliotheque

La classe Bibliotheque représente une collection de documents stockés dans un tableau :

protected Document[] document;
protected int nombre;

Elle doit inclure les méthodes suivantes :

  • Bibliotheque(int capacité) : constructeur initialisant la capacité maximale.
  • void afficherDocuments() : affiche tous les documents présents.
  • Document document(int i) : retourne le ième document.
  • boolean ajouter(Document doc) : ajoute un document, retourne true si réussi, false sinon.
  • boolean supprimer(Document doc) : supprime un document, retourne true si réussi, false sinon.
  • void afficherAuteurs() : affiche les auteurs de tous les documents qui en possèdent, en utilisant l’opérateur instanceof.

L’opérateur instanceof s’utilise ainsi :

nomObjet instanceof nomClasse

Il retourne true si nomObjet est une instance de nomClasse ou d’une de ses sous-classes.

Dans la méthode main de TestDocuments, créez une bibliothèque de capacité 50, puis ajoutez divers documents :

Bibliotheque bibliotheque = new Bibliotheque(50);

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));

Affichez ensuite :

  • La liste complète des documents avec afficherDocuments().
  • La liste des auteurs avec afficherAuteurs().

Testez la suppression d’un document :

bibliotheque.supprimer(unDocument);
bibliotheque.afficherDocuments();

Le résultat attendu est la disparition du document supprimé dans l’affichage.

La classe Livrotheque

La classe Livrotheque hérite de Bibliotheque mais ne contient que des livres. Elle doit garantir que seuls des objets de type Livre sont ajoutés.

Pour cela, elle redéfinit les méthodes :

  • public boolean ajouter(Document doc) : vérifie que doc est un Livre avant d’ajouter.
  • public Livre livre(int i) : retourne le ième livre.
  • public void afficherAuteurs() : affiche les auteurs des livres uniquement.

Notez que dans Bibliotheque, les attributs document et nombre doivent être déclarés en protected pour être accessibles dans Livrotheque.

La surcharge des méthodes est illustrée ici : si vous écrivez :

public boolean ajouter(Livre doc) {
  return super.ajouter(doc);
}

Cette méthode n’est pas une redéfinition de ajouter(Document doc) mais une surcharge, car la signature est différente. Le polymorphisme permet d’utiliser la bonne méthode selon le type des arguments.

Résultats attendus

  • Les objets de chaque classe doivent s’afficher correctement via la méthode toString(), avec leurs attributs spécifiques.
  • La bibliothèque doit contenir les documents ajoutés, affichés dans l’ordre d’insertion.
  • La méthode afficherAuteurs() doit lister uniquement les auteurs des documents qui en possèdent (livres, romans, manuels).
  • Après suppression d’un document, celui-ci ne doit plus apparaître dans la liste des documents.
  • La classe Livrotheque doit refuser l’ajout de documents non livres et ne contenir que des livres.

Pièges courants

  • Ne pas déclarer les attributs document et nombre en protected dans Bibliotheque empêche leur accès dans Livrotheque.
  • Confondre surcharge et redéfinition de méthode : une méthode ajouter(Livre doc) n’écrase pas ajouter(Document doc), elle la surcharge.
  • Oublier d’utiliser instanceof dans afficherAuteurs() pour filtrer les documents avec auteurs.
  • Ne pas initialiser correctement les variables d’instance dans les constructeurs, ce qui peut entraîner des valeurs nulles ou incorrectes.
  • Ne pas gérer la capacité maximale du tableau dans Bibliotheque, ce qui peut provoquer des erreurs lors de l’ajout.
  • Dans la suppression, ne pas vérifier que le document existe avant de tenter de le retirer.

Partager

Commentaires

Aucun commentaire pour le moment. Posez la première question.

Les commentaires sont relus avant publication. Votre e-mail n'est jamais affiché.

← Toutes les révisions