IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

question de base sur les classes


Sujet :

Langage Java

  1. #1
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 227
    Points : 98
    Points
    98
    Par défaut question de base sur les classes
    Bonjour,

    J'ai un gros problème sur une notion de base, et cela m'empèche de continuer mon programme.
    Est ce que vous pouvez m'aider?
    Je sais que ce n'est pas forcément très clair, mais c'est que ce n'est pas très clair pour moi non plus.

    Alors voilà

    J'ai construit un certain nombre d'instances d'objet dans la classe qui contient ma méthode main.
    Je voudrais dans d'autres classes modifier les variables d'instances de ces instances d'objets, et y avoir accès.Mais je ne sais pas comment faire pour qu'éclipse comprenne que les instances d'objets sur lesquels je veux qu'il exécute ces méthodes sont déjà crée dans le main. Bien sûr, je sais que je peux déclarer ces instances d'objets en paramètre de mes méthodes, mais cela me fait faire plus de 15 déclarations de variable dans toutes mes méthodes!!!
    Je pense qu'il y a beaucoup mieux, mais je ne sais pas trop comment m'y prendre.

    Comme tout ça c'est pas très clair, voilà un exemple:

    Je crée une classe Voleur avec son constructeur, ses accesseurs, ses getteurs, ces variables et ses méthodes.

    Je crée une classe Assassin avec son constructeur, ses accesseurs, ses getteurs, ces variables et ses méthodes.

    Dans ma méthode main, je construit une instance de Voleur dont la référence est voleur

    Dans ma méthode main, je construit une instance de Assassin dont la référence est assassin

    L'une des méthodes de Assassin permet d'assassiner un personnage. Cette méthode s'appelle assassinat()

    Dans la méthode main je demande au joueur qui joue assassin le personnage qu'il veut assassiner.

    Supposons qu'il souhaite assassiner voleur

    Comment faire pour que assassinat() me permette de modifier les variables d'instance de voleur?


    Merci beaucoup!!!

  2. #2
    Membre chevronné
    Avatar de afrikha
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 600
    Points : 2 208
    Points
    2 208
    Par défaut
    Je sais pas si j'ai bien compris, mais pourquoi ne faire quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    assasin.assasinat(voleur);
    dans la méthode assasinat, tu modifies les attributs de voleur, soit directement (avec voleur.setVie(blabla)) soit en appelant une méthode de Voleur qui s'en charge ( voleur.mort() )

    @+

  3. #3
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 227
    Points : 98
    Points
    98
    Par défaut
    En fait c'est ce que je veux faire, mais je n'arrive pas à modifier le voleur de la méthode main.

    Il faudrait que je lui dise dans la méthode assassinat()
    que la variable d'instance estAssassine de l'instance voleur devient true, mais je ne sais pas bien comment faire...

  4. #4
    Membre chevronné
    Avatar de afrikha
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 600
    Points : 2 208
    Points
    2 208
    Par défaut
    Je crains que tu ne sois obligé de passer l'instance de voleur en paramètre...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public void assasinat(Voleur voleur){
       voleur.setAssasine(true);
    }

  5. #5
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 227
    Points : 98
    Points
    98
    Par défaut
    Le pb c'est que assassinat est une méthode générale, c'est à dire qu'elle permet d'assassiner n'importe lequel des personnage. ce qui veut dire qu'il faut que je l'appelle avec les sept personnages!

    Pour l'instant c'est ce" que je fais, mais le pg ne marche pas, im me donne une exception
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Exception in thread "main" java.lang.NullPointerException
    	at Joueur.Joueur.jouerSonTour(Joueur.java:238)
    	at Jeu.Moteur.main(Moteur.java:202)
    voilà les lignes de code concernées


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    package Personnage;
     
    import Jeu.Moteur;
    import Joueur.Joueur;
     
    public class Assassin extends Personnage{
    //cette classe me permet de construire l'objet assassin. Outre les méthodes classiques, il faut impléméenter 
    //l'assassinat d'un autre personnage.		
    	Joueur proprietaire;
     
    	public Assassin (Joueur proprietaire,boolean estAssassine){
    		super(proprietaire);
    		this.proprietaire=proprietaire;
    	} 
    	public Joueur getProprietaire(){
    		return this.proprietaire;	
    	}
    	public void assassinat(int numeroDeLaVictime,Assassin assassin,Voleur voleur,Magicien magicien, Roi roi, Eveque eveque,Marchand marchand, Architecte architecte, Codotierre codotierre){
     
    		switch(numeroDeLaVictime){
    		case 1:System.out.println("Ne soyez pas fou!!Vous ne pouvez vous assassiner vous même!!!");
    		case 2: voleur.estAssassine=true;break;
    		case 3: magicien.estAssassine=true;break;
    		case 4: roi.estAssassine=true;break;
    		case 5: eveque.estAssassine=true;break;
    		case 6: marchand.estAssassine=true;break;
    		case 7: architecte.estAssassine=true;break;
    		case 8: codotierre.estAssassine=true;break;
    		default:System.out.println("Vous devez rentrer un nombre compris entre 2 et 8");break;
    		}
    	}
    	public boolean getAssassine(){
    		return this.estAssassine;
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    package Personnage;
     
    import Joueur.Joueur;
     
    public class Personnage {
     
    	Joueur joueur;
    	boolean estAssassine;
     
    	public Personnage (Joueur propriétaire){
    		this.joueur=propriétaire;
    		this.estAssassine=estAssassine;
    	} 
    	public static Personnage ActiveLePersonnage(String nomDuPersonnageAActiver,Joueur nomDuProprietaire){
     
    		if(nomDuPersonnageAActiver.equals("assassin")){
    			Assassin assassin=new Assassin(nomDuProprietaire,false);
    			return assassin;
    		}
     
    		else{
    			if(nomDuPersonnageAActiver.equals("voleur")){
    				Voleur voleur=new Voleur(nomDuProprietaire,false);
    				return voleur;
    			}
    			else{
    				if(nomDuPersonnageAActiver.equals("magicien")){
    					Magicien magicien=new Magicien(nomDuProprietaire,false);
    					return magicien;
    				}
    				else{
    					if(nomDuPersonnageAActiver.equals("roi")){
    						Roi roi=new Roi(nomDuProprietaire,false);
    						return roi;
    					}
    					else{
    						if(nomDuPersonnageAActiver.equals("eveque")){
    							Eveque eveque=new Eveque(nomDuProprietaire,false);
    							return eveque;
    						}
    						else{
    							if(nomDuPersonnageAActiver.equals("marchand")){
    								Marchand marchand=new Marchand(nomDuProprietaire,false);
    								return marchand;
    							}
    							else{
    								if(nomDuPersonnageAActiver.equals("architecte")){
    									Architecte architecte=new Architecte(nomDuProprietaire,false);
    									return architecte;
    								}
    								else{
    									Codotierre codotierre=new Codotierre(nomDuProprietaire,false);
    									return codotierre;
    								}
    							}
    						}
    					}
    				}
    			}
    		}
    	}
    	public Joueur getNomDuProprietaire(){
    		return this.joueur;
    	}
    	public boolean getAssassine(){
    		return this.estAssassine;
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public void jouerSonTour(Joueur joueurCourant,Pioche pioche,String personnage,int numeroDuPersonnage,Assassin assassin,Voleur voleur,Magicien magicien, Roi roi, Eveque eveque,Marchand marchand, Architecte architecte, Codotierre codotierre){
     
     
    if((numeroDuPersonnage==1)&&(joueurCourant.getPerso1().getAssassine())){
    				System.out.println(joueurCourant.getPersonnage1()+" joue par "+joueurCourant.getNom()+"a ete assassine,et passe son tour!");
    			}

  6. #6
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 227
    Points : 98
    Points
    98
    Par défaut
    Est ce qu'il est possible de mettre en variable d'instance d'une classa A des instances crées dans une classe B?

    Merci beaucoup

  7. #7
    Membre chevronné
    Avatar de afrikha
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 600
    Points : 2 208
    Points
    2 208
    Par défaut
    D'après le code que tu nous montre, il suffit de passer en paramètre de la méthode assasinat un objet de type Personnage !!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public void assasinat(Personnage perso){
       perso.estAssasine=true;
    }

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2007
    Messages : 132
    Points : 170
    Points
    170
    Par défaut
    +1 pour la réponse afrikha

    C'est marrant je suis sur d'avoir déjà joué à ce jeu sur Table.
    C'est un jeu de carte non ?

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 40
    Points : 36
    Points
    36
    Par défaut
    Bonjour.

    Si je comprends bien ce que tu cherches à faire, la solution est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public void assasinat(Object obj){
       if (obj instanceof Voleur){
          ((Voleur) obj).setAssasine(true);
       }
       ...
    }
    Tu dis que tu peux avoir n'importe quelle variable en paramètre pas seulement une référence Voleur, c pour cela que j'utilise une référence sur un Object (vu que toutes les classes Java héritent implicitement de la calsse Object). Mnt pour qu'on puisse appeler la méthode correspondante on fait un casting.

    Une autre solution, si la méthode setAssasine(Boolean) existe dans toutes les classes que tu utilises dans ce cas pas besoin de faire de test ni le casting, tu l'appeles directement sur l'objet Object, et le compiltauer va savoir la méthode de quelle classe tu veux utiliser.

  10. #10
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Points : 631
    Points
    631
    Par défaut
    Citation Envoyé par Aida Voir le message
    Bonjour.

    Si je comprends bien ce que tu cherches à faire, la solution est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public void assasinat(Object obj){
       if (obj instanceof Voleur){
          ((Voleur) obj).setAssasine(true);
       }
       ...
    }
    Tu dis que tu peux avoir n'importe quelle variable en paramètre pas seulement une référence Voleur, c pour cela que j'utilise une référence sur un Object (vu que toutes les classes Java héritent implicitement de la calsse Object). Mnt pour qu'on puisse appeler la méthode correspondante on fait un casting.

    Une autre solution, si la méthode setAssasine(Boolean) existe dans toutes les classes que tu utilises dans ce cas pas besoin de faire de test ni le casting, tu l'appeles directement sur l'objet Object, et le compiltauer va savoir la méthode de quelle classe tu veux utiliser.
    Et si tu veut pas passer pour un goret en faisant des cast et des instanceof dans tous les sens, tu vas te renseigner sur le design pattern visitor.

  11. #11
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 287
    Points : 208
    Points
    208
    Par défaut
    ou bien tu repenses ton système:
    tu as une interface Personnage dans laquelle tu définis les méthodes dont tu as besoin : (ici tu n'as parlé que d'assassinat)
    + public void assassinat(Personnage p);
    Ton interface est donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public interface Personnage {
       public void assassinat(Personnage p);
    }

    Dans chaque classe de personnages, Voleur, Roi, Eveque, etc... tu implémentes l'interface Personnage.

    Ta classe Voleur devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class Voleur implements Personnage {
      private boolean estAssassine = false;
     
      public void assassinat(Personnage p) {
         p.setEstAssassine(true);
      }
     
      //Getter et Setter
    }
    Dans ce cas, tu peux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Voleur voleur = new Voleur();
    Roi roi = new Roi();
     
    voleur.assassinat(roi);
    Voila j'espère avoir répondu à ta question

Discussions similaires

  1. Question de "cours" sur les classes Qt
    Par Invité dans le forum Débuter
    Réponses: 1
    Dernier message: 28/09/2010, 09h19
  2. question de base sur les pointeurs
    Par Ganondorf dans le forum Débuter
    Réponses: 4
    Dernier message: 26/08/2010, 17h07
  3. Réponses: 2
    Dernier message: 09/02/2009, 11h16
  4. Réponses: 13
    Dernier message: 10/10/2007, 10h09
  5. Question de base sur les classes
    Par deaven dans le forum C++
    Réponses: 3
    Dernier message: 27/11/2005, 16h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo