"1) switch avec instanceof et un transtypage "
A proscrire pour des tas de raisons. Même si c'est fonctionnel, java est un langage Objet et non pas procédural.
Il faut faire passer la classe mère en abstrait, en définissant la fonction use en abstrait, que tu redéfinira dans chacun des consommables. Quand tu utilisera la fonction use() sur un consommable, le compilateur choisira pour toi la bonne méthonde. (Celle de livre si c'est un livre par exemple)
Pour le 2, tu peut mettre dans la classe seReproduire() l'utilisation d'une méthode abstraite dans Animal du style :
class Animal {
void abstract reproduction();
Animal seReproduire(){
Animal animal = reproduction();
}
}
Et dans chacune des classes qui hérite d'animal t'aura une méthode :
classe Cat extends Animal {
Animal reproduction(){
Animal cat = new Cat();
return cat ;
}
}
On appelle ça le Design pattern : Template Method, tu pourra trouver plus d'info sur le net.
La prochaine fois, hésite pas a demander sur le forum Programmation de JVC. Plus de gens sont apte a t'aider la-bas.
https://www.jeuxvideo.com/forums/0-47-0-1-0-1-0-programmation.htm