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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du 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
    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
    Membre du 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
    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
    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
    Membre du 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
    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
    Membre du 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
    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 éclairé
    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
    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", ...

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, 18h05
  2. problème d'héritage avec jpa
    Par info20111 dans le forum JPA
    Réponses: 0
    Dernier message: 03/06/2013, 10h59
  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, 16h29
  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, 09h15
  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, 10h37

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