[java] problême par rapports à l'héritage et au cast

johanb Messages postés 33 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 19 mai 2006 - 8 déc. 2005 à 09:44
super_toinou Messages postés 764 Date d'inscription mardi 25 mai 2004 Statut Membre Derniè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".



Si quelqu'un peut m'eclairer la dessus svp.

en vous remerciant

8 réponses

super_toinou Messages postés 764 Date d'inscription mardi 25 mai 2004 Statut Membre Dernière intervention 8 mars 2011 6
8 déc. 2005 à 10:29
alors ton code n a pas l air trop faux mais c est ton approche qui est mauvaise je pense
a mon avis t as un joueur CPU et un humain


tu dervait donc avoir une classe


public abstract class Joueur{


....


public abstract jouer();


}

pis une classe

public class JoueurCPU extends Joueur{

public void jouer(){
//fé les trucs pr un joueur CPU
}
}
et
public class JoueurHumain extends Joueur{

public void jouer(){
//fé les trucs pr un joueur humain en gros ton else
}
}

pis ds ta fifo tu fé
Joueur j1 = new JoueurCPU();
Joueur j2 = new JoueurHumain();

t ajoute et qd tu récup tu fé juste
joueur = (Joueur) liste.get(i);


temp.jouer();


et ca suffit, le polymorphisme joue pr toi ;)

++ Toinou
0
johanb Messages postés 33 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 19 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.



encore merci ! :D
0
johanb Messages postés 33 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 19 mai 2006
8 déc. 2005 à 13:05
une autre petite question...

si je fais:

Joueur j;



for(i=0;<=nombreJoueurs;i++){



//au hasard on crée soit

j=new JoueurHumain;

//ou soit

j=new JoueurCPU;



file.add(j);

}


yaura pas de problème? ou je dois faire:

JoueurHumain j;

JoueurCPU cpu;

for(i=0;<=nombreJoueurs;i++){



//au hasard fait soit

j=new JoueurHumain

file.add(cpu)

//ou soit

cpu=new JoueurCPU

file.add(cpu);

}


Perso je préfère la 1ere solution mais je ne sais pas vraiment si ça marche

encore désolé :$
0
super_toinou Messages postés 764 Date d'inscription mardi 25 mai 2004 Statut Membre Dernière intervention 8 mars 2011 6
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
}
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
super_toinou Messages postés 764 Date d'inscription mardi 25 mai 2004 Statut Membre Dernière intervention 8 mars 2011 6
8 déc. 2005 à 13:44
sinon je viens de penser a un truc, si ta partie
0
super_toinou Messages postés 764 Date d'inscription mardi 25 mai 2004 Statut Membre Dernière intervention 8 mars 2011 6
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 !!!
0
johanb Messages postés 33 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 19 mai 2006
9 déc. 2005 à 22:59
j'ai pas bien compris la solution avec la map (j'en ai jamais manipulé), puis j'ai plus beaucoup de temps pour utiliser ça :p



Sinon pour ta soluce plus haut j'ai pas compris: pourquoi "if(temp)" ?
0
super_toinou Messages postés 764 Date d'inscription mardi 25 mai 2004 Statut Membre Dernière intervention 8 mars 2011 6
12 déc. 2005 à 14:46
sorry j reply un peu tard
le if temp c t pour if (temp
0
Rejoignez-nous