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

Collection et Stream Java Discussion :

Problème d'héritage avec ArrayList


Sujet :

Collection et Stream Java

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 8
    Points : 3
    Points
    3
    Par défaut Problème d'héritage avec ArrayList
    Bonsoir à tous,

    Tout d'abord je tiens à m'excuser si je me trompe de section mais je suis nouveau sur ce forum.

    Je vous expose donc mon problème :

    J'ai une classe mère nommé Compte qui possède deux classes filles "CompteCourant" et "LivretEpargne". Utilisant la sérialisation plutôt qu'une base de donnée (contrainte personnelle, j'aime me faire du mal -_-'), j'ai du stocker les classes filles dans une ArrayList de Compte. Bon jusque là pas de soucis et comme ça j'écris tout dans un seul fichier et je récupère tout correctement avec les bons formats de classes. Bref. Les choses se compliquent quand je veux créer la fiche d'un compte. Soit lire les données d'un compte de l'une ou de l'autre des classes filles (la classe mère n'a pas de constructeur).

    Voici le code qui fait mal aux yeux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    while (!trouve && i < f.getListeCompte().size()) {
     
                if (numCompte == f.getListeCompte().get(i).getNumeroCompte()) {
                    trouve = true;
                    if(f.getListeCompte().get(i).getClass().getName().equals("gestioncb.CompteCourant")){
                        CompteCourant leCompte = f.getListeCompte().get(i);
                    }
                }else{
                    i++;
                }
            }
    CompteCourant leCompte = f.getListeCompte().get(i) est vraiment pas conseillé et de toute façon NetBeans n'en veut pas même si j'ai bien vérifié qu'il s'agissait d'un compteCourant au préalable.

    Une solution serait de passer ma fenêtre dans ma classe mère Compte et de la rendre Abstract et de créer une méthode qui remplirait les champs de la fenêtre. Ainsi j'utiliserai le polymorphisme.... Mais est-ce propre ?

    Quelqu'un peut-il venir à mon secours ?

  2. #2
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Bon du coup je pense avoir trouvé une réponse :

    Dans ma boucle je récupère un Compte que j'envoie a ma méthode remplirFiche qui est définit comme suit :

    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
     
    public void RemplirChamps(Compte leCompte) {
     
            if (leCompte.getClass().getName().equals("gestioncb.CompteCourant")) {
                CompteCourant ceCompte = (CompteCourant) leCompte;
                TF_CoutCarte.setText(ceCompte.getCoutCarte() +"");
                TF_CoutMensuel.setText(ceCompte.getCoutMensuel() +"");
                TF_typeCompte.setText("Compte Courant");
            } else {
                livretEpargne ceCompte = (livretEpargne) leCompte;
                TF_Plafond.setText(ceCompte.getPlafond() +"");
                TF_interet.setText(ceCompte.getInteretAnnuel() +"");
                TF_typeCompte.setText("Livret Epargne");
            }
     
            TF_dateOuverture.setText(leCompte.getDateOuverture().toString());
            TF_numCompte.setText("" + leCompte.getNumeroCompte());
            //TF_solde.setText("");
            TF_titulaire.setText(leCompte.getTitulaire().getNom() + " " + leCompte.getTitulaire().getPrenom());
     
            B_EffectuerOperation.setVisible(true);
            B_ajouterCarte.setVisible(true);
     
     
        }
    Que pensez-vous de cette méthode ? Trop cracra ou pas ? En tout cas ça marche.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Points : 653
    Points
    653
    Par défaut
    Tout d'abord, sur le plan technique, lorsqu'on veut vérifier le type d'un objet, il y a le mot-clé instanceof :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if (leCompte instanceof CompteCourant) {
        CompteCourant ceCompte = (CompteCourant) leCompte;
    }
    Ensuite, de manière plus générale, il n'est pas très judicieux d'utiliser la serialisation pour persister les données des comptes, car la serialisation ne permet pas d'effectuer les opérations CRUD comme l'autorise l'utilisation d'une base de données.

    Et puis pour ton IHM, perso j'aurais fait deux écrans distincts pour les comptes courants et les livrets d'épargne. Ces comptes partagent bien des informations communes, comme la date d'ouverture, le numéro de compte, etc.. Mais certaines informations sont spécifiques comme le taux de rémunération.

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Merci pour ta réponse. Le coup de la sérialisation c'est imposé par mes études car dans un autre projet j'utilise déjà une base de donnée. Sinon pour l'affichage des fiches de comptes je "créer" la fenêtre en fonction du type de compte justement (d'ailleurs merci pour le coup du instance of).

    Mais le problème est toujours le même, est-ce "bien" de traiter en fonction du type de classe ou est-ce trop sale ? Et as-tu une alternative ?

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Au passage, pour les opérations CRUD je passe par des arrayList comme ça à chaque modification ou suppression je vide le fichier et j'écris l'arrayList sur celui-ci. En passant par le buffer je met moins de 2 secondes pour un fichier de 3.6 Mo donc je suis large.

  6. #6
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 54
    Points : 77
    Points
    77
    Par défaut
    En fait il y a selon moi un problème de logique d'archi.

    Soit tu utilises un ArrayList<Compte> et effectivement tu veux manipuler une collection de "Compte" et alors à toi d'exploiter le polymorphisme comme il se doit pour ne pas avoir besoin d'appel à instanceof. Soit les classes "ComptesCourant" et "LivretEpargne" sont des entites logiques différentes (bien que toutes les deux héritent de "Compte") et alors il te faut 2 ArrayList ; une pour chaque type d'éléments.

    A toi de voir ce que tu cherches effectivement à manipuler dans tes ArrayList.


    De la même manière tu pourrais très bien avoir encore des sous-classes de "CompteCourant" du genre "CompteCourantClassique" "CompteCourantJeune", ...

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Oui c'est bien là le problème. Je tentais de voir s'il était possible (ou pas) de passer par une seul arrayList<Compte> qui prendrait en charge à la fois les compteCourant et LivretEpargne. Actuelle ça marche mais c'est un peu cracra niveau code puisque je fais deux trois instanceof.

    Par contre faire 2 arrayList je trouve ça dommage. ça m'embête enfaite car je trouve super utile justement de pouvoir définir une ArrayList de classe mère intégrant des classes Filles.

    Après j'ai une autre solution : Passer la fenetre en paramètre à mon compte.
    Mais crois-tu que c'est judicieux ?
    Ainsi, comme tu l'as dis, je pourrais faire du poly sur mes classes filles et ainsi ne plus avoir besoin d'instanceof. Par contre je passe la fenêtre à mes comptes et c'est les classes filles qui rempliront les champs de la fenêtre...

    Qu'en penses-tu ?

  8. #8
    Membre éclairé Avatar de JoeChip
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 536
    Points : 803
    Points
    803
    Par défaut
    Pourquoi tu ne met pas une méthode "remplirChamps" différente pour les deux classes ?! ensuite tu traites tout comme la classe-mère etc, c'est la base de la programmation objet... Dès que tu vois qu'à un niveau tu dois savoir de quelle classe-fille il s'agit, c'est que tu dois mettre une méthode dans chaque classe-fille. Par ailleurs, pour parcourir ton ArrayList, t'es mieux de faire un genre de :

    for (Compte compte : f.getListCompte()) compte.remplirChamps();

    Du coup si t'as bien fait les 2 méthodes remplirChamps, tout est réglé, non ?

    Tu as mis ton message sur les fenetre en même temps que le mien ; je ne comprend pas tout, mais en effet, c'est à ça que sert le polymorphisme.

    Grrr, on est 3 à rédiger en même temps
    Sans danger si utilisé conformément au mode d'emploi.

    (anciennement BenWillard, enfin moins anciennement que ... enfin bon c'est une longue histoire... Un genre de voyage dans le temps...)

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Salut Ben,

    Effectivement c'est une solution à laquelle j'ai pensé mais le truc c'est qu'on m'a dit qu'il était déconseillé de passer une Frame dans un Objet qui représente les données traitées afin de respecter des modèles de programmation, type MVC (et autres design pattern).

    Donc à partir de là ... Je ne sais plus trop quoi faire.

  10. #10
    Membre éclairé Avatar de JoeChip
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 536
    Points : 803
    Points
    803
    Par défaut
    Pas grave, dans ta Frame tu reçois un objet de type Compte, dont tu appelles la fonction remplisChamps(this), genre

    De toutes façons "on m'a dit" ça compte pas, ce qui compte c'est d'avoir un truc propre, et faire un truc genre if telType then unTruc else unAutreTruc c'est pas propre
    Sans danger si utilisé conformément au mode d'emploi.

    (anciennement BenWillard, enfin moins anciennement que ... enfin bon c'est une longue histoire... Un genre de voyage dans le temps...)

  11. #11
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Oui je sais que ce que j'ai fait c'est pas propre sinon je n'aurais pas créé le message ^^

    Un méthode qui m'a été donnée est de faire soit 2 ArrayList comme Vakhyw me l'a dit ou encore supprimer l'héritage et faire en sorte que mes ex classes filles prennent comme attribut un compte et donc utiliser l'encapsulation plutôt que héritage et poly et là c'est archi propre ^^ (auteur de la solution : kiko0 sdz)

    mais passer la fenêtre en paramètre est ce qui convient le mieux en terme de temps de réalisation (m'en reste pas beaucoup) et pour ce qui est de répondre aux contraintes de polymorphisme et d'héritage demandée.

    Donc au final, je vais sans doute faire comme ça dans un premier temps puis recoder plus proprement.

    Merci à tous !

Discussions similaires

  1. Problème d'héritage avec powerAmc v15
    Par khalid95800 dans le forum Merise
    Réponses: 7
    Dernier message: 30/07/2013, 19h05
  2. problème d'héritage avec jpa
    Par info20111 dans le forum JPA
    Réponses: 0
    Dernier message: 03/06/2013, 11h59
  3. Problème d'héritage avec Q_OBJECT
    Par L'elfe d'Azur dans le forum Débuter
    Réponses: 1
    Dernier message: 03/04/2013, 17h29
  4. Problème d'héritage avec les génériques.
    Par ZZZzzz2 dans le forum Langage
    Réponses: 11
    Dernier message: 26/01/2012, 10h15
  5. Problème d'héritage avec une classe abstraite
    Par Ph.denis dans le forum C++
    Réponses: 7
    Dernier message: 22/03/2008, 11h37

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