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

Java Discussion :

Problème héritage ou pas


Sujet :

Java

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2012
    Messages : 66
    Points : 49
    Points
    49
    Par défaut Problème héritage ou pas
    Bonjour,

    Je suis en train de coder la simulation d'une fourmilière et je suis confronté un petit problème depuis hier. Donc, j'ai une classe mère abstraite Fourmi. Ses filles sont Reine, Ouvrière, Soldat et Soigneur.
    La Reine a une méthode produire() qui produit un certains nombre d'Ouvriere, de Soldat... renseignés en paramètres et qui retourne un Arraylist de Fourmi. De plus, dans cette même classe, il y a une fonction privée qui génère les Fourmi.

    Voici le Code :

    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
     
    /**
             * Retourne une collection de nouvelles fourmis
             * @return ArrayList de fourmis
             */
    	public ArrayList<Fourmi> produire(){
    		//Collection qui contiendra les nouvelles fourmis qui vont naître
    		ArrayList<Fourmi> lesNouvellesFourmis = new ArrayList<Fourmi>();
     
    		//initialisations
    		Ouvriere uneOuvriere = new Ouvriere();
    		Soldat unSoldat = new Soldat();
    		Soigneur unSoigneur = new Soigneur();
     
    		//5 ouvrieres
    		genererFourmi(5, uneOuvriere, lesNouvellesFourmis);
     
    		//3 soldats
    		genererFourmi(3, unSoldat, lesNouvellesFourmis);
     
    		//2 soigneurs
    		genererFourmi(2, unSoigneur, lesNouvellesFourmis);
     
     
    		return lesNouvellesFourmis;
    	}
     
    	public Message action() {
    		return Message.getInstance(1, "Dix nouvelles fourmis viennent dans la fourmilière");
    	}
     
    //LOCAL
     
    	private void genererFourmi(int nbre, Fourmi typeFourmi, ArrayList<Fourmi> collecFourmi){
    		if(typeFourmi instanceof Ouvriere) {
    			for(int i = 0; i<nbre; i++){
    				Ouvriere uneOuvriere = new Ouvriere(1);
    				collecFourmi.add(uneOuvriere);
    			}
    		}else if(typeFourmi instanceof Soldat) {
    			for(int i = 0; i<nbre; i++){
    				Soldat unSoldat = new Soldat(1);
    				collecFourmi.add(unSoldat);
    			}
    		}else if(typeFourmi instanceof Soigneur) {
    			for(int i = 0; i<nbre; i++){
    				Soigneur unSoigneur = new Soigneur(1);
    				collecFourmi.add(unSoigneur);
    			}
    		}
     
     
    	}
    Ma question est : Comment puis-je faire pour avoir une collection comprenant des objets Mere et Filles afin de pouvoir accéder à leur propre méthode ?

    Merci d'avance

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Ta liste contient des instances des différentes classes, mais quand tu vas parcourir cette liste tu vas devoir caster dans la bonne classe pour pouvoir appeler les méthodes spécifiques des classes filles :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    List<Fourmi> fourmis = reine.produire();
     
    for(Fourmi fourmi : fourmis ) {
     
       if ( fourmi instanceof Ouvriere ) { // par exemple s'il on veut tester s'il s'agit d'une instance de Ouvriere
          Ouvriere ouvriere = (Ouvriere)fourmi; // on caste pour manipuler l'instance dans le type voulu
          // maintenant tu peux appeler les méthodes spécifiques à la classe Ouvriere sur la variable ouvriere...
       }
       else if ... // pour une autre classe
     
    }
    [EDIT]En Java 8, tu pourras également extraire la sous-liste comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    List<Ouvriere> listOuvrieres = fourmis.stream()
                    .filter(f -> f instanceof Ouvriere).map( f -> (Ouvriere)f )
                    .collect(Collectors.toList());
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre du Club
    Inscrit en
    Février 2013
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Février 2013
    Messages : 34
    Points : 43
    Points
    43
    Par défaut
    Créé une interface IFourmiAction
    Contenant les méthodes suivantes :
    ActionReine(reine r);
    ActionOuvriere(ouvriere o);
    ActionSoigneuse(soigneuse s);
    Définis une méthode abstraite dans ta classe Fourmi:

    Public abstract void faire action(IFourmiAction a)

    Dans la classe de la reine tu feras l'appel a ActionReine

    Reste a implémenter les actions . une action sera par exemple la simulation de 1 seconde de ton jeu pendant laquelle ; la reine copule , chaque ouvrière récolte N ressources ...
    Ensuite tu auras juste une boucle

    Fort( fourmi f : fourmis) f.faire action(this.simulationActions);

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut BorisTheBear,

    A quoi sert une Interface à trois méthodes ? S'il y avait 42 sortes de fourmis, il faudrait une interface à 42 méthodes ?

    Une interface, ou une abstraction à une seule méthode, suffirait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public abstract class Fourmi {
     
       public abstract void action();
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class Reine extends Fourmi {
     
        public void action() {
             // faire quelque chose propre à la reine
        }
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class Ouvriere extends Fourmi {
     
        public void action() {
             // faire quelque chose propre à l'ouvriere
        }
     
    }
    Ou alors, une interface comme ça, pourquoi pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public interface IActionFourmi<F extends Fourmi> {
     
        void action(F fourmi);
     
    }
    ce qui est évite d'avoir des méthodes avec des noms spécifiques par type.

    Mais ça ne répond pas à la question, qui était, à partir d'une Collection contenant plusieurs types de fourmi, comment appeler les méthodes spécifiques de chaque type de fourmi.

    PS. Quand tu mets du code, arrange-toi pour éviter les fautes de frappe (fort, au lieu de for, par exemple, ou la majuscule à public, l'espace dans un nom de méthode...)
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème Héritage JavaScript
    Par Flavien dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 10/07/2006, 13h29
  2. [Mail] Problème fonction mail() pas de sujet ni corps!
    Par webrider dans le forum Langage
    Réponses: 3
    Dernier message: 28/06/2006, 17h04
  3. Problème héritage CWnd
    Par ptitJP dans le forum MFC
    Réponses: 4
    Dernier message: 21/04/2006, 11h41
  4. [Merise] Héritage ou pas ?
    Par Totomanator dans le forum Schéma
    Réponses: 11
    Dernier message: 12/03/2006, 17h18
  5. héritage ou pas??
    Par neonico dans le forum C++
    Réponses: 1
    Dernier message: 24/11/2004, 10h51

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