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 :

Arraylist et héritage, comment profiter des deux?


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 19
    Par défaut Arraylist et héritage, comment profiter des deux?
    Bonjour!
    Le problème me parait logique, mais je n'ai rien trouvé nulle part à ce sujet.

    J'ai une arraylist d'objets de classe A1, A2 etc. dérivants tous de A. (d'ailleurs l'arraylist est typée <A>)
    Je pensais naïvement que l'héritage me permettait donc, en prenant n'importe lequel de ces objets, d'appeler les fonctions redéfinies de chacune des classes.

    Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(int i=0;i<listeObjets.size();i++)
    			{
    				listeObjets.get(i).appelFonction();
    			}
    Or ce code appelle la fonction de la classe mère (A). Ce qui pourrait paraitre normal vu que listeObjets contient du A, pour le compilateur. Mais du coup, s'il faut détecter systématiquement la classe pour appeler la fonction, je ne vois pas l'intérêt du polymorphisme...
    Trois possibilitées (non incompatibles):
    1) Faut utiliser une astuce...
    2) Faut pas utiliser une arraylist pour ce genre de besoin...
    3) Je n'ai pas tout compris à la POO, ce qui est possible vu mon statut de programmeur du dimanche.

    Merci d'avance de tenter d'éclairer ma lanterne!

  2. #2
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,


    Citation Envoyé par Fikus
    Or ce code appelle la fonction de la classe mère (A). Ce qui pourrait paraitre normal vu que listeObjets contient du A, pour le compilateur. Mais du coup, s'il faut détecter systématiquement la classe pour appeler la fonction, je ne vois pas l'intérêt du polymorphisme...
    C'est normal que le compilateur ne t'autorise à appeler que les méthodes de A car pour lui tu utilises un objets de type A. L'intérêt du polymorphisme vient du fait que c'est à l'exécution que sera déterminé le vrai code à exécuter si la méthode est redéfini, par exemple si tu as :

    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
    class A {
    	public void appelFonction() {
    		System.out.println("A");
    	}
    }
     
    class A1 extends A {
    	@Overrides
    	public void appelFonction() {
    		System.out.println("A1");
    	}
    }
     
    class A2 extends A {
    	@Overrides
    	public void appelFonction() {
    		System.out.println("A2");
    	}
    }
     
    class A3 extends A2 {
    	@Overrides
    	public void appelFonction() {
    		System.out.println("A3");
    	}
    }
    Et que ta liste de A possède plusieurs types différents (A, A1, A2 et A3), tu verras que tu auras un affichage différent pour chaque type...


    Maintenant, si tu veux appeler une méthode présente uniquement dans une autre classe que A, tu est obligé de caster :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    A a = listeObjets.get(i);
    if (a instanceof AX) {
    	AX ax = (AX) a;
    	ax.maMethodeDeAX();
    }
    a++

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 19
    Par défaut
    Ok, merci beaucoup.
    En fait mon code ressemblait pas mal à ce que tu as écris, mais l'ajout des @Override m'a permis de comprendre un peu mieux le fonctionnement de la redéfinition. (merci aussi au debugage d'Eclipse) (et aussi de virer des private qui n'aidaient pas non plus, suis-je bête). Après recoiffage de mes méthodes échevelées, ça marche à merveille.

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

Discussions similaires

  1. Gridview: Comment récupérer les valeurs des deux clés?
    Par Thomas_Laurent dans le forum ASP.NET
    Réponses: 1
    Dernier message: 02/02/2007, 14h54
  2. Réponses: 7
    Dernier message: 16/05/2006, 15h40
  3. [ADO.Net][VB.NET] Comment copier des données entre deux BDD différentes ?
    Par maddog2032 dans le forum Accès aux données
    Réponses: 6
    Dernier message: 06/06/2005, 11h01
  4. comment faire des espaces entre deux liens ???
    Par baaps dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 24/03/2005, 09h53
  5. Réponses: 7
    Dernier message: 30/12/2004, 12h01

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