Partage
  • Partager sur Facebook
  • Partager sur Twitter

Héritage et ArrayList

Sujet résolu
    10 octobre 2018 à 20:04:23

    Et bien tout d'abord bonsoir. Voila, j'écris ce message car je rencontre un petit problème avec la gestion d'une ArrayList. Cette ArrayList est issue une Collection d'habitants, qui appartient à la classe Ville (pour ne pouvoir accéder aux habitants qu'à partir d'une ville). De plus, j'ai aussi une classe Etranger qui hérite de la classe Habitant avec l'attribut Nationalité en plus.

    Voici le code de mes 3 classes : 

    Ville : 

    public class Ville {
    
        private String NomVille;
         ArrayList<Habitant> LesHabitants;
    
        public Ville(String pNomVille) {
            this.NomVille = pNomVille;
            this.LesHabitants = new ArrayList<>();     
        }
    
        public String getNom() {
            return NomVille;
        }
    
        public void setNom(String Nom) {
            this.NomVille = Nom;
        }
    
        public ArrayList<Habitant> getLesHabitants() {
            return LesHabitants;
        }
    
        public void setLesHabitants(ArrayList<Habitant> LesHabitants) {
            this.LesHabitants = LesHabitants;
        }           
    }
    

    Habitant : 

    public class Habitant {
        
    
            private String Nom;
            private String Prénom;
            private int AnneedeNaissance;
            
            public Habitant(String pNom, String pPrénom, int pAnneedeNaissance) {
                this.Nom = pNom;
                this.Prénom = pPrénom;
                this.AnneedeNaissance = pAnneedeNaissance;
            }
    
            public String getNom() {
                return Nom;
            }
    
            public void setNom(String pNom) {
                this.Nom = pNom;
            }
    
            public String getPrénom() {
                return Prénom;
            }
    
            public void setPrénom(String pPrénom) {
                this.Prénom = pPrénom;
            }
    
            public int getAnneedeNaissance() {
                return AnneedeNaissance;
            }
    
            public void setAnneedeNaissance(int pAnneedeNaissance) {
                this.AnneedeNaissance = pAnneedeNaissance;
            }
            
        }

    Etranger : 

    public class Etranger extends Habitant {
        private String Nationalité;
        public Etranger(String pNom, String pPrénom, int pAnneedeNaissance, String pNationalité) {
            super(pNom, pPrénom, pAnneedeNaissance);
            this.Nationalité = pNationalité;
        }
        public String getNationalité() {
            return Nationalité;
        }
        public void setNationalité(String pNationalité) {
            this.Nationalité = pNationalité;
        }
    }
    

    Le problème vient dès lors que j'essaye de caster la collection pour qu'elle puisse m'afficher l'accesseur getNationalité() de l'attribut Nationalité. 
    Comme sur l'image ci-dessus, je n'arrive pas à obtenir le get que je recherche, soit par un mauvais placement des parenthèses (j'ai essayer plein de combinaisons) soit parce que j'ai oublié une étape. Merci d'avance de votre aide :).

    • Partager sur Facebook
    • Partager sur Twitter
      11 octobre 2018 à 8:19:04

      Salut.

      Je crois qu'il te manque une parenthèse dans ton "cast" (après "get(i)"). Tu devrais également mettre ta "ArrayList" en "private" et utiliser l'accesseur (Voir créer une méthode supplémentaire pour accéder directement à l'habitant en fonction de l'index => getHabitant(int index) ).

      -> System.out.println(((Etranger)MaVille.getLesHabitants().get(i)).getNationalité());

      Pour tester si ton habitant est un étranger, tu peux passer par l'opérateur "instance of" plutôt que de tester le nom de la class avec une comparaison de "String".

      -
      Edité par CeBiM 11 octobre 2018 à 8:24:02

      • Partager sur Facebook
      • Partager sur Twitter
      Les seules questions bêtes sont celles qui ne sont pas posées. Mieux vaut paraître bête une fois que de le rester à vie."Vis comme si tu devais mourir demain. Apprends comme si tu devais vivre toujours."
        12 octobre 2018 à 19:39:03

        Merci beaucoup de ton aide, tu me sauves la vie ! Et j'ai encapsulé l'ArrayList comme convenu. Bonne soirée.
        • Partager sur Facebook
        • Partager sur Twitter
          16 octobre 2018 à 13:13:14

          A la ligne d'en dessus, tu peux utiliser "instanceof" pour savoir si une variable appartient bien à une classe

          if(MaVille.getLesHabitants().get(i) instanceof Etranger)


          Sinon, tout est dit plus haut.
          • Partager sur Facebook
          • Partager sur Twitter
            17 octobre 2018 à 9:38:03

            Les réponses données ci-dessus sont correctes et amènent une réponse à ta question.

            instanceof est une possibilité, mais il faut aussi envisager la fonction isAssignableFrom de la classe "Class" qui permet une exécution plus rapide que isntanceof.

            Maintenant, conceptuellement (je ne connais pas l'exercice), la démarche qui consiste à ne faire exister l'attribut Nationalité que dans la classe Etranger est discutable, et c'est ce choix qui t'amène à devoir écrire du code spécifique à une classe dérivée dans un traitement qui se veut abstrait.

            Pourquoi ne pas partir du principe que, pour tout habitant, par défaut, la nationalité est Français (ou null, pour indiquer un résidant du pays d'utilisation sans "hardcoder" la France) et surcharger la définition dans Etranger pour pouvoir, dans ce cas là uniquement, spécifier le pays de nationalité ?

            En faisant de la sorte, tu conserves un fonctionnement ou la nationalité est précisée uniquement pour les étrangers, mais ton code d'utilisation n'a plus besoin de faire un "cast" et une vérification de type pour bien fonctionner...

            A réfléchir en fonction de l'exercice à faire, bien entendu.

            • Partager sur Facebook
            • Partager sur Twitter

            Héritage et ArrayList

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown