I. Le modèle de classes & fonctionnalités

image.png

Contraintes sur les attributs :

Contraintes sur fonctionnalités :

<aside> ⚠️

Les classes feuilles doivent toutes être instanciables. Pour les autres, on ne sait pas.

</aside>

II. Exercices sur les constructeurs

<aside> ⚙

Donner le code des constructeurs de : Equide, Chevaux, Mules, Jument, Ane . En écrivant le moins de code + copier/coller possible.

</aside>

1. Approche “en suivant bêtement les contraintes” (= bof)

class Equide{
	int force, endurance, age, esperanceVie;
	public Equide(){age = 0;}
}

class Chevaux extends Equide{
	public Chevaux(){esperanceVie=20;}
}

class Mules extends Equide{
	public Mules(){esperanceVie=25;}
}

class Jument extends Chevaux{
	public Jument(){
		force = 4;
		force += 1;
		Random loto = new Random();
		force += loto.nextInt(5)-2;
		endurance = 6;
		endurance -= 1;
		endurance += loto.nextInt(5)-2;
}

class Ane extends Anes{
	public Ane(){
		Random loto = new Random();
		force = 6 + loto.nextInt(5)-2;
		endurance = 5 + loto.nextInt(5)-2;
	}
}

Avec cette approche, on fait la création du random + tirage +2/-2 dans chaque classe feuille = 8 copier/coller.

2. Approche avec réflexion

Réflexion sur les opérations communes entre classes + évaluer si on peut utiliser des valeurs par défaut qui s’appliquent à la majorité des cas (≥ 50% des cas).

Les 8 copier/coller peuvent être réduits à 1 seul exemplaire en déplaçant le code dans le constructeur de la classe Equide .

Comme il y a 50% des cas où l’on connait la force, on peut choisir d’initialiser l’attribut force avec une valeur moyenne de 4 (ou 6) et modifier dans une sous-classe si la valeur par défaut ne correspond pas.

class Equide{
	int force, endurance, age, esperanceVie;
	Random loto,
	public Equide(){
		age = 0;
		esperanceVie = 20;
		loto = new Random();
		force = 4 + loto.nextInt(5)-2;
		endurance = 6 + loto.nextInt(5)-2;
	}
}

class Chevaux extends Equide{
	public Chevaux(){
		super();
		force +=1;
		endurance -=1;
	}
 }
 
 class Mules extends Equide{
	 public Mules(){
		 super();
		 endurance +=1;
		}
	}
	
	class Jument extends Chevaux{
		public Jument(){
			super();
		}
	}
	
	class Ane extends Anes{
		public Ane(){
			super();
			force +=2;
			endurance -=2;
		}
	}

3. Solution avec ajout de code

Dans les classes femelles représentant les mâles, on doit corriger les attributs force / endurance.

Si on arrive à connaître le genre directement dans Equidé on peut éviter cette modification

<aside> ⚠️

La classe Equide n’est pas censée savoir quoi que ce soit sur les sous-classes

</aside>

DONC SURTOUT PAS :

Equide(){
	...
	~~if(this instanceof Etalon || this instanceof Ane)~~...
}