Mission
- Construire des robots avec différents comportements.
- Vocabulaire à connaître à l'issue du TD : this, sous-classe, héritage, constructeur, redéfinition de méthode (overriding).
Constructeurs, héritage
- Créez un nouveau fichier Cyborg.java dans lequel vous définissez une sous-classe de la classe Robot :
class
Cyborgextends
Robot { ... } (le mot-clef extends indique que l'on crée une sous-classe)Cette classe Cyborg hérite automatiquement des attributs et méthodes de la classe Robot. Vous n'avez pas besoin de les recopier dans cette classe.Vous ne devez pas modifier la classe Robot. - Recopiez-y à l'identique le constructeur de la classe Robot, mais en en faisant un constructeur de la classe Cyborg. Vous aurez des erreurs de compilation à cause de 'private'. Comprenez pourquoi, mais ne corrigez pas l'erreur et passez à la suite.
- Pour éviter la duplication de code, reprenez votre constructeur et remplacer son corps par :
super (nomImage, init_x, init_y, pt) ;
qui appelle automatiquement le constructeur de la classe parent (Robot). - En redéfinissant dans la classe Cyborg une seule méthode de la classe Robot (mais pas testeCollision) , faites en sorte que le Cyborg change de direction (au hasard) lorsqu'il percute un autre robot. Vous venez de faire une redéfinition de méthode.
- Modifiez Anim.java pour tester avec quelques robots et quelques cyborgs. Les robots et les cyborgs sont mis dans le même tableau
robots
. - Ajoutez deux nouveaux attributs au Cyborg :
nombreCollisions
qui permet de compter le nombre de collisions subies par le cyborg, etmaxCollisions
qui fixe une limite (6 pour l'instant). Au delà de la limite, faites en sorte que le cyborg explose (pour l'explosion, utiliser directement une méthode de la classe Robot). - Testez et vérifiez qu'il explose bien. Vous pouvez avoir l'impression que le cyborg explose trop tôt : essayez de trouver une explication.
- Ajoutez un deuxième constructeur qui reçoit un argument supplémentaire : la valeur de
maxCollisions
. - Testez avec plusieurs cyborgs ayant des limites de collisions différentes.
Questions de compréhension
- Dans la méthode testeCollision de la classe Robot, est-il possible que 'this' ou 'autre' soient de type Cyborg ?
- Dans la classe Anim, expliquez pourquoi on peut mettre les Robots et les Cyborg dans le même tableau
robots
. - Pourquoi la méthode explose peut-elle être appelée sur un Cyborg ?
- Vous avez normalement deux constructeurs dans la classe Cyborg (identifiez-les). Comment sait-on quel constructeur est utilisé au moment du
new
?
Suite de la mission
- Dans un autre fichier Killer.java, définissez une nouvelle sous-classe de Robot.La caractéristique d'un Killer est la suivante : lorsqu'un killer entre en collision avec un autre Robot, il le fait exploser, même si c'est un autre killer (les killers ne sont pas très gentils).
- Programmez cette nouvelle classe (n'oubliez pas le constructeur.
- Testez avec des robots, des cyborgs et des killers. Au bout d'un moment, il ne doit plus rester grand monde.
- Rendez vos killers plus gentils : ils ne font exploser un robot que si c'est la x-ème fois (avec x paramétrable) qu'ils le rencontrent (chaque killer doit se souvenir des robots qu'il a déjà rencontrés). La seule modification autorisée à la classe Robot consiste à ajouter un nouvel attribut privé : un numéro de série (de 0 à n-1), et un getter (chercher "getter java" sur internet).Concevez les choses proprement : le nombre total de robots ne doit pas apparaître en dur dans la classe Killer. Il doit être passé en argument au constructeur.
Pour terminer
- Créez une sous-classe Indestructible de robots qui ne peuvent pas exploser. Vous ne devez modifier aucune autre classe (ni Robot, ni Killer).
- Testez.
À retenir : les constructeurs
Chaque classe a toujours au moins un constructeur. Le constructeur d'une classe fille doit toujours commencer par un appel à
super()
. Questions de compréhension
Les notions suivantes sont essentielles. Parcourez au besoin les documents à votre disposition pour bien les assimiler.
- Savez-vous créer une sous-classe ?
- Qu'est-ce que l'héritage ?
- Identifier les attributs dans chaque classe, et dans chaque classe, lister les attributs hérités.
- Qu'est-ce qu'un constructeur ?
- Qu'est-ce que la redéfinition de méthode ?