Exercice n° 1 (= 12 points): Dans cet exercice tous les attributs des classes sont private, et supposez l'existence de la définition de leurs getters et setters. Dans une bibliothèque, on peut emprunter différents types d'ouvrage : livre, magazine, CD-ROM... Tous les ouvrages ont un code (type entier), un titre, un état booléen initialement à false (pour indiquer qu'un ouvrage est emprunté ou non), numéro de la carte du lecteur qui va emprunter l'ouvrage et le nombre de fois que l'ouvrage a été emprunté. Les livres sont décrits. en plus, par leur nom d'auteur et maison d'édition. Les magazines ont, de plus, les propriétés numéro et périodicité (hebdomadaire, mensuel. trimestriel). Enfin les CD-ROM ont de plus un thème.
Pour répondre à cette question, nous allons procéder étape par étape:
Ouvrage
:public class Ouvrage { private int code; private String titre; private boolean estEmprunte; private int numeroCarteLecteur; private int nombreEmprunts; public Ouvrage(int code, String titre) { this.code = code; this.titre = titre; this.estEmprunte = false; this.numeroCarteLecteur = 0; this.nombreEmprunts = 0; } public String toString() { return "Code: " + code + ", Titre: " + titre + ", Emprunté? " + estEmprunte + ", Numéro de carte: " + numeroCarteLecteur + ", Nombre d'emprunts: " + nombreEmprunts; } public void affiche() { System.out.println(this.toString()); } public void emprunter(int numeroCarte) { if (!estEmprunte) { estEmprunte = true; numeroCarteLecteur = numeroCarte; nombreEmprunts++; } } }
Pour les getters et setters, je vais les omettre car ceci est une pratique usuelle et vous avez mentionné qu'ils sont supposés exister.
Livre
, Magazine
et Cdrom
:public class Livre extends Ouvrage { private String nomAuteur; private String maisonEdition; public Livre(int code, String titre, String nomAuteur, String maisonEdition) { super(code, titre); this.nomAuteur = nomAuteur; this.maisonEdition = maisonEdition; } public String toString() { return super.toString() + ", Auteur: " + nomAuteur + ", Maison d'édition: " + maisonEdition; } } public class Magazine extends Ouvrage { private int numero; private String periodicite; public Magazine(int code, String titre, int numero, String periodicite) { super(code, titre); this.numero = numero; this.periodicite = periodicite; } public String toString() { return super.toString() + ", Numéro: " + numero + ", Périodicité: " + periodicite; } } public class Cdrom extends Ouvrage { private String theme; public Cdrom(int code, String titre, String theme) { super(code, titre); this.theme = theme; } public String toString() { return super.toString() + ", Thème: " + theme; } }
Bibliotheque
:public class Bibliotheque { public static void main(String[] args) { Livre livre = new Livre(1, "Les Misérables", "Victor Hugo", "Gallimard"); Magazine magazine = new Magazine(2, "Le Point", 1234, "Hebdomadaire"); Cdrom cdrom = new Cdrom(3, "Apprendre Java", "Programmation"); livre.emprunter(13); cdrom.emprunter(8); // Simuler le retour du livre // Si nous avions un attribut "estEmprunte" setter nous pourrions faire // livre.setEstEmprunte(false); // Simuler un autre emprunt par une autre personne livre.emprunter(20); livre.affiche(); magazine.affiche(); cdrom.affiche(); } }
En supposant que les attributs restent inchangés (pas de méthode de retour de l'ouvrage implémentée) et que les emprunts ne sont pas affectés (pas de méthode pour changer estEmprunte
de true
à false
), l'affichage serait le suivant:
Code: 1, Titre: Les Misérables, Emprunté? true, Numéro de carte: 20, Nombre d'emprunts: 2, Auteur: Victor Hugo, Maison d'édition: Gallimard Code: 2, Titre: Le Point, Emprunté? false, Numéro de carte: 0, Nombre d'emprunts: 0, Numéro: 1234, Périodicité: Hebdomadaire Code: 3, Titre: Apprendre Java, Emprunté? true, Num