TD4 2324v1

Objectifs :
- Maîtriser les concepts liés à l'héritage en java (voir les rappels au verso)
- Apprendre les nouveaux concepts d'attribut statique et de constante

En plus d'écrire des méthodes en java, vous devez savoir répondre aux questions posées. Si ce n'est pas le cas, demandez à l'intervenant de vous aider à trouver la réponse. Tout ce qui est souligné a forcément de l'importance.

I. Écrire une classe VTC (Véhicule de Transport en Commun) :

I.1 Deux attributs : le nombre de roues aNbRoues et le remplissage en passagers aEstComplet (complet ou pas).
Donc quel type est le mieux adapté pour cet attribut ?
I.2 Un constructeur à un seul paramètre entier (Lequel ? Puisqu'à la création de l'objet, le remplissage ne doit pas être complet !).
Combien de paramètres aurait le constructeur naturel de cette classe ?
I.3 Une procédure roule (sans paramètre) qui se contente d'afficher le remplissage entre deux parenthèses, puis " Les N roues tournent." (N étant le nombre de roues). Un exemple d'exécution est donné à la 1ère ligne du III.6.
I.4 Une procédure freine qui se contente d'afficher "J'appuie sur le frein.". De combien de paramètres a-t-elle besoin ?

II. Écrire une classe Avion :

II.1 C'est évidemment une sorte de Véhicule de Transport en Commun.
II.2 Un attribut : le nombre de réacteurs.
II.3 Un constructeur à combien de paramètres, si on veut pouvoir préciser aussi le nombre de réacteurs ? (et si on suppose qu'à la création, le remplissage n'est toujours pas complet !).
Combien d'attributs y a-t-il dans cette classe ? Combien d'attributs possède un objet de cette classe ?
II.4 Une procédure vole qui se contente d'afficher "Je vole.".
II.5 Redéfinir la procédure freine pour qu'elle affiche "J'inverse les N réacteurs." (N étant le nombre de réacteurs) avant d'effectuer la procédure de freinage "normale" (c'est-à-dire celle pour les VTC).
II.6 Redéfinir la procédure roule pour qu'elle affiche "Je pousse les réacteurs." seulement si l'avion est complet, avant d'effectuer la procédure de roulage "normale" dans tous les cas.
A-t-on le droit de tester le remplissage ainsi ? Pour résoudre le problème de compilation, voir point suivant :
II.7 Ajouter dans VTC un accesseur qu'on appellera estComplet (et servez-vous en !).
II.8 Ajouter dans VTC une procédure invComplet qui inverse l'état de remplissage à chaque appel (complet <--> non complet). Elle nous servira dans la classe Utilisation.

III. Écrire une classe Utilisation :

III.1 Comme d'habitude, cette classe ne sera pas instanciée (quelle conséquence pour ses méthodes ?), et ne sert qu'à contenir une procédure essai pour mettre en œuvre les 2 classes précédentes. Cette procédure devra :
III.2 Déclarer/créer un objet VTC à 6 roues, puis le faire rouler et freiner.
III.3 Déclarer/créer un objet Avion à 4 roues et 2 réacteurs, le rendre complet, puis le faire rouler, voler, et freiner.
III.4 Déclarer une variable référence de type VTC et lui affecter un nouvel objet Avion (pourquoi a-t-on le droit ?) à 8 roues et 4 réacteurs, et le faire rouler.
III.5 Le faire voler. Peut-on appeler la méthode vole() ? Pour résoudre ce premier problème de compilation, affecter la référence précédente directement à une nouvelle référence d'Avion. Mais peut-on écrire cette affectation ? Pour résoudre ce second problème de compilation, convertir la référence précédente en référence d'Avion avant de l'affecter à la nouvelle référence, puis enfin réussir à le faire voler et freiner.
III.6 L'exécution de la procédure essai devrait donner les affichages suivants, compte tenu des 3 objets créés :
(false) Les 6 roues tournent.
J'appuie sur le frein.          VTC 6
Je pousse les réacteurs.
(true) Les 4 roues tournent.
Je vole.
J'inverse les 2 réacteurs.
J'appuie sur le frein.          Avion 4 2
(false) Les 8 roues tournent.
Je vole.
J'inverse les 4 réacteurs.
J'appuie sur le frein.          Avion 8 4

IV. Comptage : ajouter dans la classe VTC :

IV.1 Un nouvel attribut : le nombre d'objets VTC créés (on ne tiendra pas compte des éventuels objets détruits).
IV.2 L'initialisation de cet attribut (à 0) à l'endroit habituel pour les initialisations d'attributs.
IV.3 L'incrémentation de cet attribut. À quel endroit passe-t-on forcément à chaque création de VTC (ou d'Avion) ?
N'y a-t-il pas un problème ? D'ailleurs, combien y aura-t-il de compteurs si on crée 3 objets ? Et combien vaudront-ils ?
Il nous faudrait un seul compteur pour toute la classe, donc un attribut "de classe" donc un attribut statique. Donc corriger la déclaration.
IV.4 Comment peut-on initialiser un tel attribut ? Grâce à un "bloc statique" qui se situe en dehors de toute méthode (typiquement entre les attributs et les constructeurs) :
static { aNombre = 0; } qui peut contenir plusieurs instructions. Pourquoi pas this.aNombre = 0; ?
IV.5 Comment une autre classe pourra-t-elle accéder à cet attribut privé ? Ajouter l'accesseur qui convient (utilisable avant la création du 1er objet).
IV.6 Ajouter aussi dans la classe Utilisation des affichages du nombre d'objets VTC, aux 4 endroits appropriés.

V. Constante : ajouter dans la classe VTC :

V.1 Un nouvel attribut constant : le nombre minimum de roues que le constructeur (modifiez-le !) retient pour initialiser l'attribut. Pour signaler un attribut constant, on fait précéder son type du mot final, comme pour les paramètres. D'autre part, un attribut constant (appelé ' une constante') s'écrit toujours entièrement en majuscules, éventuellement séparées par un _ , ici MIN_ROUES par exemple.
V.2 Y a-t-il un intérêt à dupliquer cette constante dans tous les objets de la classe VTC ? Donc ...
V.3 Une constante reçoit généralement sa valeur dès sa création en ajoutant = valeur à la fin de la déclaration. En résumé :
private static final int NOM_CONSTANTE = valeur; (choisissez-en une plausible)
V.4 Si la constante peut avoir un intérêt en dehors de la classe, il est même permis de la déclarer publique, puisqu'il n'y a aucun risque qu'elle soit modifiée.
À partir du moment où une constante a été déclarée, on doit toujours l'utiliser dans le programme et ne plus utiliser directement la valeur qu'elle contient ; ainsi, si on décide de changer cette valeur, la modification du programme sera aisée.
Pourquoi un simple remplacer tout dans un logiciel de traitement de texte ne conviendrait-il pas ici ?
V.5 Ajouter ce qu'il faut dans le code pour s'assurer qu'aucun VTC ne pourra avoir un nombre de roues inférieur à MIN_ROUES.

RAPPELS POUR LE TD4