[java] problême par rapports à l'héritage et au cast
johanb
Messages postés33Date d'inscriptionmercredi 6 août 2003StatutMembreDernière intervention19 mai 2006
-
8 déc. 2005 à 09:44
super_toinou
Messages postés764Date d'inscriptionmardi 25 mai 2004StatutMembreDernière intervention 8 mars 2011
-
12 déc. 2005 à 14:46
Bonjour à tous,
je programme un jeu de cartes dans lequel il ya plusieurs joueurs, humain ou IA (controlé par l'ordinateur).
voici les classes joueur utilisées:
public class Joueur{
//....
public boolean isCPU(){
if(this instanceof JoueurCPU){
return true;
}
else{
return false;
}
}
}
public class JoueurCPU extends Joueur{
//...
//ajout d'une méthode supplémentaire
public void jouer(){
}
}
Si maintenant on effectue le test suivant, on obtiendra:
Joueur j=new Joueur();
JoueurCPU cpu=new JoueurCPU();
j.isCPU(); //retourne false
j.jouer(); //erreur;, méthode non définie pour cette classe
cpu.isCPU(); //retourne true
jcpu.jouer(); //ok
Mon problème est que je stocke mes joueurs dans un vecteur (plus
précisément dans une file LIFO, grace à la classe LinkedList). Je
voudrais pour chaque jouer de la file effectuer une action selon le
type, come le montre le listing ci-dessous (exemple):
LinkedList file=new LinkedList();
Joueur j=new Joueur();
JoueurCPU cpu=new JoueurCPU();
//on ajoute les joeurs à la file:
file.add(j); //ajout à l'indice 0
file.add(cpu); //ajout à l'indice1
Joueur temp;
for(int i=0;i<2;i++){
temp=(Joueur)liste.get(i);
if(temp.isCPU()){
//cas d'un joueur cpu
temp.jouer
}
else{
//cas d'un joueur humain
}
}
C'est la que je me pose la question. Est-ce que le code est juste? Je
ne connais pas grand chose au cast et je n'ai pas trouvé de cours assez
complets. Je me demande si temp ne sera pas toujours considéré comme
une instance de la classe Joueur. A moins qu'il fasse faire
temp=(JoueurCPU)liste.get(i) et recaster en focntion du type de joueur.
OU autre possibilité: redéfinir la méthode isCPU dans la class JoueurCPU.
on aurra par exemple dans la classe Joueur "return false" et dans la classe JoueurCPU "return true".
johanb
Messages postés33Date d'inscriptionmercredi 6 août 2003StatutMembreDernière intervention19 mai 2006 8 déc. 2005 à 12:27
nikel, merci bien super toinou :D
je vais faire le coup des 2 classes qui héritent de Joueur.
le seul probleme c'est que la méthode jouer de la classe JoueurHumain
ne sert à rien (elle sera vide), pask'en fait j'ai mon application
(class Application) qui attend que le joeur humain ai cliqué sur une
carte dans la présentation (class Presentation).
en gros si c'est à un joueur humain de jouer, on attend un clic de
l'interface, sinon on appelle la méthode jouer du JoueurCPU. Et le
probleme c'est que la classe Joueur n'a aucun lien avec l'interface dc
il ne peut pas réagir aux évènements.
en gros ça serait:
for(int i=0;i<2;i++){
temp=(Joueur)liste.get(i);
if(temp.isCPU()){
//cas d'un joueur cpu: appel de la méthode jouer
//celle ci gère directement le dialogue avec l'interface pour piocher des cartes...
temp.jouer
}
else{
//cas d'un joueur humain
//on attend un évènement sur la présentation
}
}
Moi pas pensé avoir été clair hug...désolé
Mais je garde ta soluce pour la méthode isCPU(), en abstract dans la classe Joueur,
retourne faux dans la classe JoueurHumain et vrai dans la classe JoueurCPU.
super_toinou
Messages postés764Date d'inscriptionmardi 25 mai 2004StatutMembreDernière intervention 8 mars 20116 8 déc. 2005 à 13:40
alors sur ton post juste dessus la 1ere solution ne pose pas de pb ca va marcher sans soucis.
Par contre conceptuellement, ta méthode isCpu() n a pas gd chose a faire ds la classe JoueurHumain, ok ca va marcher
mais tu peux tres bien faire le test comme ca :
for(int i=0;i<2;i++){
temp=(Joueur)liste.get(i);
if(temp ){
//cas d'un joueur cpu: appel de la méthode jouer
//celle ci gère directement le dialogue avec l'interface pour piocher des cartes...
temp.jouer
}
else{
//cas d'un joueur humain
//on attend un évènement sur la présentation
}
}
Vous n’avez pas trouvé la réponse que vous recherchez ?
super_toinou
Messages postés764Date d'inscriptionmardi 25 mai 2004StatutMembreDernière intervention 8 mars 20116 8 déc. 2005 à 13:46
merde ca a planté, en gros je disai que tu pouvais utiliser les maps pr stocker les joueurs et avoir donc la possibilité de faire soit des map.get('"humain") ou map.get("cpu") soit parcourir ts les objets de ta map et de faire la solution du instanceof !!!