1°/ Rencontre universelle

  • Dans le TP n°1, quand deux humains h1 et h2 sont pris dans la population, on doit connaître leur type d'instance afin d'appeler la bonne méthode de rencontre. On a donc un code qui ressemble à :
h1 = pop.getHumain(index1);
h2 = pop.getHumain(index2);
 
if (h1.isHomme()) {
   if (h2.isFemme()) {
      h = (Homme)h1;
      f = (Femme)h2;
      bebe = h.rencontre(f);
   }
}
...
 
  • Ces tests découlent directement du fait que l'on a deux méthodes rencontre() avec des signatures différentes dans Homme et Femme.
  • L'idéal serait d'avoir la même signature donc de prendre en paramètre un type Humain et de tester dans rencontre() le type d'instance de cet humain passé en paramètre.
  • Reste le problème que même en procédant ainsi, on est toujours obligé de faire un transtypage de l'objet qui appelle rencontre() et donc de tester de quelle instance il est.
  • Fort heureusement, le polymorphisme permet de régler ce problème
  • En s'inspirant des exemples du TD n°2, modifiez les classes Humain, Homme et Femme afin de pouvoir écrire directement h1.rencontre(h2) sans qu'il y ait d'erreurs à la compilation ni à l'exécution.

 


2°/ Classement

2.1°/ Classement mono-critère
  • Modifiez l'entête de Humain pour que la classe implémente l'interface Comparable :
class Humain implements Comparable<Humain> {
...
 

 

  • Dans Humain.java, ajoutez la méthode suivante et complétez le code sachant que :
    • la méthode renvoie -1 si l'age de this est < à l'age de h
    • la méthode renvoie 0 si les ages sont égaux
    • la méthode renvoie 1 sinon.
public int compareTo(Humain h) {
 
   // à compléter
}
 
  • On suppose que le programme principal s'appelle TP2.java (copier/coller de TP1.java)
  • Modifiez TP2.java ainsi que Population.java pour qu'à la fin de chaque tour de jeu, la population soit triée par âge croissant et ensuite affichée (NB : pour voir comment trier une collection, il existe des exemples à foison sur le Net)
2.2°/ Classement multi-critères.
  • L'objectif est d'essayer de classer les humains selon leur âge mais pour deux hommes du même âge, de les classer selon leur salaire.
  • L'idée est de redéfinir la méthode compareTo() pour ajouter ce cas.
 
  • Pour cela, modifiez TP2.java pour tirer un salaire aléatoirement entre 1000 et 11000 lorsque l'on crée la population initiale.
  • Modifiez également Homme.java :
    • ajoutez un attribut int salaire dans la classe Homme.
    • modifiez les constructeurs de Homme pour initialiser le salaire à 0 ou bien à une valeur donnée en paramètre
    • redéfinissez la méthode vieillir() pour qu'à 18 ans, on initialise le salaire d'un Homme avec une valeur tirée aléatoirement entre 1000 et 11000.
    • redéfinissez la méthode compareTo() :
      • si les ages de this et de h sont différents : on renvoie -1 ou 1, comme pour la méthode de Humain.
      • si les ages sont identiques, alors si h est une Femme, on renvoie 0 et si h est un Homme, on renvoie la différence entre le salaire de this et celui de h.
class Homme extends Humain {
  ...
  public int compareTo(Humain h) {
 
     // à compléter
  }
  ...
}
 
  • Lancez l'exécution de TP2 sur au moins 25 tours.
  • On constate que le tri ne se fait pas comme on l'attend : le tri entre salaire n'est pas respecté.
  • Il existe une solution simple à mettre en oeuvre, en changeant juste une valeur. A vous de trouver laquelle. Cependant, vous constaterez que cette solution peut occasionnellement provoquer une erreur "bizarre". Essayez de comprendre d'où vient cette erreur et trouvez une solution (plus compliquée) pour répondre à l'énoncé.

 

3°/ Tous les garçons et les filles de mon âge ...

 

  • Pour compliquer un peu le modèle et le moteur de jeu, on ajoute la classe Garcon et la classe Fille.
  • Globalement, il existe 2 solutions pour créer ces 2 classes :
    1. Garcon et Fille héritent de Humain,
    2. Garcon hérite de Homme et Fille hérite de Femme.
  • A vous de choisir une de ces solutions, notamment en tenant compte des fonctionnalités suivantes :
    • quand un bébé naît, on crée une instance de Garcon ou Fille (au lieu de Homme ou Femme),
    • les garçons ont les même attributs que Homme, excepté salaire. Les filles ont les même attributs que Femme.
    • quand un garçon ou une fille atteint 18 ans, il est retiré de la population et à la place, on met une instance de Homme ou Femme, ayant les même valeurs d'attribut, plus tirage du salaire pour Homme.
    • quand un garçon et une fille se rencontrent, ils ne font jamais un bébé. En revanche, cela peut arriver si un garçon (resp. une fille) d'au moins 15 ans rencontre une femme (resp. un homme).
    • quand un garçon et une fille de rencontrent, il y a une chance sur X (à vous de régler X) pour qu'il y ait un accident et qu'un humain (le garçon et la fille inclus) de la population meure.

 

  • Ecrivez ces deux classes en respectant totalement les principes POO => pas de instanceof. Cela nécessite de modifier les classes existantes.