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 :

Conseils : Classe abstraite et treemap


Sujet :

Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2010
    Messages : 94
    Points : 66
    Points
    66
    Par défaut Conseils : Classe abstraite et treemap
    Bonjour,

    J'ai créé une TreeMap d'animaux avec comme clé leur code et en valeur leur type Animal. (classe Animal)

    J'ai créé un classe abstraite : Animal avec deux classes Mechant et Gentil qui hérite d'Animal.

    Animal est une classe abstraite car les "Mechant" et "Gentil" boivent, dorment, crient, mangent... mais les Mechant ont une particularité ils possèdent la méthode attaque() (que les gentils n'ont pas).

    Du coup, quand je parcours ma treemap:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for(Animal courant : ferme.getListAnimaux()){
    }
    public ArrayList<Animal> getListAnimaux(){
    		ArrayList<Animal> listOfanimal= new ArrayList<Animal>();
    		for(Animal animal : animaux.values())
    			listOfanimal.add(animal);
    		return listOfanimal;
    	}
    je ne peux faire animal.attaque() car la méthode attaque n'a pas été définie comme abstract.
    Est-ce une faute de déclarer cette méthode comme asbtract et rajouter dans gentil :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void attaque(){}
    ou bien est-ce qu'il y a un autre moyen ?
    j'ai essayé des :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(mechant) courant = (Mechant) courant
    en vain...

    Merci d'avance,

  2. #2
    Membre éclairé Avatar de Heimdal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 549
    Points : 718
    Points
    718
    Par défaut
    Tu peux faire un (animal instanceof Mechant) pour savoir si tu as affaire à un Mechant, mais utiliser cette clause pointe souvent un problème de conception.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2010
    Messages : 94
    Points : 66
    Points
    66
    Par défaut
    ah, j'ai oublié de le dire, j'ai essayé aussi cette méthode.

    Voilà le problème majeure est : comment concevoir cette idée ??

    J'ai pensé à remplacer la classe abstraite Animal par une interface AnimalInterface, mais cela ne me convient pas car quand j'ajoute l'aniaml à la ferme il est pas de type "Animal"

  4. #4
    Membre éclairé Avatar de Heimdal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 549
    Points : 718
    Points
    718
    Par défaut
    Je pense qu'il te faut une méthode plus générique (partagé par toutes les catégories d'animaux) au somment de ta hiérarchie d'interface. Et ce serait dans cette méthode abstraite que serait réalisé les actions spécifiques.

    Ça pourrait être un truc du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public interface Animal {
    	
    	void manger();
    	
    	void boire();
    	
    	void dormir();
    	
    	void crier();
    	
    	void interagir(Environnement env);
    
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public interface Gentil extends Animal{
     
    	void fuir(Mechant mechant);
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public interface Mechant extends Animal{
     
    	void attaquer(Animal cible);
     
    }
    Et dans les implémentations de la méthode void interagir(Environnement env) tu peux faire tes actions spécifiques.

    En espérant que ca t'inspire un tantinet...

    ++

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2010
    Messages : 94
    Points : 66
    Points
    66
    Par défaut
    en effet cela m'inspire, du coup je peux retranscrir cela avec abstract...
    ou interagir apellera fuir d'un côté et attaque de l'autre

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

Discussions similaires

  1. [Debutant] Une classe abstraite en parametre ?
    Par kiroukou dans le forum Débuter
    Réponses: 8
    Dernier message: 03/02/2005, 15h05
  2. [Débutant(e)] toString + classes abstraites
    Par debdev dans le forum Langage
    Réponses: 9
    Dernier message: 26/01/2005, 15h22
  3. [Debutant][Conception] Classes abstraites et interface.
    Par SirDarken dans le forum Langage
    Réponses: 4
    Dernier message: 29/10/2004, 00h02
  4. Classe abstraite / MVC
    Par caramel dans le forum MVC
    Réponses: 5
    Dernier message: 01/04/2003, 09h27
  5. pb constructeurs classes dérivant classe abstraite
    Par Cornell dans le forum Langage
    Réponses: 2
    Dernier message: 10/02/2003, 19h02

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