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 :

Instancier en itérant sur une collection abstraite


Sujet :

Langage Java

  1. #1
    Futur Membre du Club
    Inscrit en
    Février 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Février 2006
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Instancier en itérant sur une collection abstraite
    Bonjour à tous !

    Le programme sur lequel je travaille est destiné à un cabinet paramédical. Les visites des patients peuvent être de deux types : séances de rééducation ou entretiens. La plupart des traitements applicables sont similaires, mais quelques bricoles diffèrent, en particulier la méthode de facturation. J'ai donc une classe abstraite Session, et deux classes filles, Seance et Entretien. Pour les différencier, j'utilise un attribut type, qui prend la valeur seance si l'objet est de type Seance, et entretien si l'objet est de type Entretien :
    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
     
    public abstract class Session {  
        private int id;
        private Date date;
        private int duree;
        private int dureePreparation;
        private double tauxHoraire = 57.6;
        private int taches;
        private String notes;
        private boolean facture;
        private String type;
     
        //Méthodes abstraites
    }
     
    public class Seance extends Session {
        private ArrayList<Patient> patients;
        private String type = "séance";
        private boolean bilanInitial=false;
        private boolean bilanRenouvellement=false;
        private boolean bilanRedige=false;
        private int deplacement=0;
     
        //Méthodes
    }
     
    public class Entretien extends Session {
        private Patient patient;
        private int taches = 0;
        private String type = "entretien";
     
        //Méthodes
    }
    Seulement, à un moment donné, j'ai besoin de parcourir toutes les sessions, et d'appliquer un traitement différent selon qu'il s'agit d'un type de session ou de l'autre. J'ai donc fait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ArrayList<Session> liste = getListeVisites();
    for (Session s:liste) {
        if (s.getType ().equals ("séance")) {
            Seance enCours = (Seance) s;
        } else {
            Entretien enCours = (Entretien) s;
        }
        enCours.facturer();
        //Suite du traitement
    Malheureusement, s.getType() renvoie null, ce qui lève une exception NullPointerException. Pourtant, le débogueur m'indique bien que type vaut "seance", mais je ne vois pas comment lui faire comprendre l'évidence...

    Merci de votre aide.

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,



    C'est normal car tu as déclaré 3 attributs nommé "type" :
    • Session.type
    • Entretien.type
    • Seance.type

    Ces trois attributs sont totalement différent malgré leurs noms similaires ! Et la méthode getType() est surement implémenté dans Session et te renvoi donc Session.type qui ne doit pas être initialisé !

    Les attributs ne s'héritent pas ! Tu dois passer la valeur du type à la classe parente (par exemple dans le constructeur) :
    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
    abstract class Session {
    	private final String type;
     
    	public Session(String type) {
    		this.type = type;
    	}
     
    	public String getType() {
    		return type;
    	}
    }
     
    class Entretien extends Session {
    	public Entretien() {
    		super("entretien");
    	}
    }
     
    class Seance extends Session {
    	public Seance() {
    		super("seance");
    	}
    }
    Attention car tu sembles avoir ce problème avec d'autre attribut...


    Mais tu pourrais directement utiliser la méthode getClass()...


    Et je ne comprend pas ce que tu veux faire dans ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        if (s.getType ().equals ("séance")) {
            Seance enCours = (Seance) s;
        } else {
            Entretien enCours = (Entretien) s;
        }
        enCours.facturer();
    (Au passage tu dois encore avoir un conflit de nom sur "enCours")


    Ne pourrais-tu pas tout simplement utiliser l'héritage ???

    a++

  3. #3
    Futur Membre du Club
    Inscrit en
    Février 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Février 2006
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Ne vous cassez pas la tête : j'ai trouvé !

    Il suffisait d'utiliser instanceof ou, mieux, getClass() !

    Désolé pour cette question de débutant...

  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2007
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Février 2007
    Messages : 80
    Points : 76
    Points
    76
    Par défaut
    Bonjour,

    Il me semble que ta variable type est inutile dans les 3 classes, en tout cas pour le seul usage que tu en fais dans le problème exposé.

    Dans ta classe abstraite Session() tu as, je présume, déclare la méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    abstract void facturer();
    Méthode que tu redéfinis dans les deux classes filles, Entretien et Séance.

    Pour ce que tu veux faire, il suffit alors d'appeler la méthode facturer(), sans te préoccuper si ta Session est un Entretien ou une Séance : c'est tout l'intérêt de l'héritage (cf remarque adiGuba !)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ArrayList<Session> liste = getListeVisites();
    for (Session s:liste) {
       s.facturer();
    }
    A +
    Philippe.

  5. #5
    Futur Membre du Club
    Inscrit en
    Février 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Février 2006
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Désolé, adiGuba : nos réponses se sont croisées.

    Citation Envoyé par adiGuba Voir le message
    Salut,



    C'est normal car tu as déclaré 3 attributs nommé "type" :
    • Session.type
    • Entretien.type
    • Seance.type

    Ces trois attributs sont totalement différent malgré leurs noms similaires ! Et la méthode getType() est surement implémenté dans Session et te renvoi donc Session.type qui ne doit pas être initialisé !

    Les attributs ne s'héritent pas ! Tu dois passer la valeur du type à la classe parente (par exemple dans le constructeur) :
    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
    abstract class Session {
    	private final String type;
     
    	public Session(String type) {
    		this.type = type;
    	}
     
    	public String getType() {
    		return type;
    	}
    }
     
    class Entretien extends Session {
    	public Entretien() {
    		super("entretien");
    	}
    }
     
    class Seance extends Session {
    	public Seance() {
    		super("seance");
    	}
    }
    Il y a effectivement une grosse erreur de conception dans mon code : je voulais forcer la valeur de l'attribut type dans les classes filles, mais je peux le faire en ajoutant une instruction dans le constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public class Seance extends Session {
        private ArrayList<Patient> patients;
        private boolean bilanInitial=false;
        private boolean bilanRenouvellement=false;
        private boolean bilanRedige=false;
        private int deplacement=0;
     
        public Seance () {
            this.type = "séance";
            //Le reste du constructeur...
    }

    Citation Envoyé par adiGuba Voir le message
    Attention car tu sembles avoir ce problème avec d'autre attribut...
    Non, sauf erreur, je ne crois pas : l'attribut patient de Entretien (de type Patient) est différent de l'attribut patients de Seance (de type ArrayList<Patient>) : certaines séances sont des séances de groupe (avec plusieurs patients), alors que les entretiens sont toujours individuels.

    Citation Envoyé par adiGuba Voir le message
    Mais tu pourrais directement utiliser la méthode getClass()...
    C'est effectivement ce que je vais faire (cf. mon post précédent)

    Citation Envoyé par adiGuba Voir le message
    Et je ne comprend pas ce que tu veux faire dans ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        if (s.getType ().equals ("séance")) {
            Seance enCours = (Seance) s;
        } else {
            Entretien enCours = (Entretien) s;
        }
        enCours.facturer();
    (Au passage tu dois encore avoir un conflit de nom sur "enCours")


    Ne pourrais-tu pas tout simplement utiliser l'héritage ???
    En fait, mon code est un peu plus compliqué que ça, je l'ai allégé pour me concentrer sur le problème qui me préoccupait : selon que l'objet en cours est une Seance ou un Entretien, il doit être ajouté dans une collection différente (tabSeances ou tabEntretiens), collections qui seront manipulées plus loin dans le code. Je ne peux donc pas utiliser l'héritage ici : j'ai besoin de connaître la classe de l'objet que je manipule.

    Merci en tout cas pour la réponse rapide !

    ++

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

Discussions similaires

  1. tri alphabétique sur une collection
    Par samtheh dans le forum VBA Access
    Réponses: 6
    Dernier message: 18/06/2007, 14h50
  2. Probleme de scope sur une collection
    Par ataya dans le forum Struts 1
    Réponses: 10
    Dernier message: 23/02/2007, 19h19
  3. VBNET : Agir sur une collection de contrôles ?
    Par VinZent dans le forum Windows Forms
    Réponses: 3
    Dernier message: 12/11/2006, 09h01
  4. Réponses: 1
    Dernier message: 25/10/2006, 13h41
  5. [Struts] <logic:iterate> sur une collection d objets c
    Par trax020 dans le forum Struts 1
    Réponses: 2
    Dernier message: 12/05/2005, 00h11

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