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 :

Polymorphisme - choix de la méthode


Sujet :

Langage Java

  1. #1
    Membre actif Avatar de Roy Miro
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 273
    Points : 290
    Points
    290
    Par défaut Polymorphisme - choix de la méthode
    Bonjour,

    Je ne comprends pas pourquoi la méthode h de A est choisie plutôt que celle de C.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class A {
     
        public A(){
        }
     
        public void h(A a, A aa){
        	System.out.println("h3 de A");
        }
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class C extends A{
     
        public C() {
        }
     
        public void h(A a, B b){
        	System.out.println("h de C");
        }
     
     
    }
    Voici la classe avec le main:
    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
    public class Test {
     
        public Test() {
        }
     
        public static void main(String[]args){
     
       	A a = new A();
        	B b = new B();
        	C c = new C();
    	A x =new C();//transtypage
     
       	/*la référence est de type A mais le type réel est C*/
            x.h(a,b);//appel de ma méthode h de A (ce que je ne comprend pas) 
     
        }	
      }
    A l'éxécution, il m'affiche "h3 de A". Je m'attendais à "h de c". En effet, bien que la reference soit de type A, le type réel est C. Comme h est redéfinie dans C, ne devrait-il pas appeler h de C?

    Merci pour votre aide.

  2. #2
    Expert éminent
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Points : 7 679
    Points
    7 679
    Par défaut
    Ce point a déjà été mentionné dans la devinette de mathk.

    Du moment que les signatures de A.h et B.h sont différentes, il s'agit de la surcharge (overload) et pas de la redéfinition (override). Donc, exit le polymorphisme : du moment que x est de type A, Java appèlle A.h indépendament du type d'instanciation.

  3. #3
    Membre actif Avatar de Roy Miro
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 273
    Points : 290
    Points
    290
    Par défaut
    Merci je n'avais pas en tête la nuance mais pourquoi si j'ajoute ces 2 méthodes h dans la classe A, il m'affiche "h de C"? (la précédente est toujours là)

    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
     
    public class A {
     
        public A(){
        }
     
        public void h(A a, B b){
        	System.out.println("h de A");
        }
     
        public void h(B b, B bb){
        	System.out.println("h2 de A");
        }
     
        public void h(A a, A aa){
        	System.out.println("h3 de A");
        }
     
     
    }
    On a maintenant donc 3 méthodes h dans la classe A.

  4. #4
    Expert éminent
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Points : 7 679
    Points
    7 679
    Par défaut
    Tu as donc h(A a, B b) dans A et dans C ==> redéfinition (override) et donc le polymorhisme est de retour !
    Java appèle le h du type d'instanciation, qui est le C.

  5. #5
    Membre actif Avatar de Roy Miro
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 273
    Points : 290
    Points
    290
    Par défaut
    Pour savoir si ce sera l'override ou l'overload qui sera appliqué, faut-il prendre en compte le type de retour des méthodes aussi ou uniquement le profil (nom+liste des types d'arguments)? Et si j'ai bien compris le polymorphisme est prioritaire sur la surcharge?

  6. #6
    Expert éminent
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Points : 7 679
    Points
    7 679
    Par défaut
    Pour dissiper les ambiguités :

    méthodes surchargées :
    • dans la même classe ou dans les classes filles
    • même nom
    • paramètres différents
    • type de retour différents
    méthodes redéfinies :
    • dans les classes filles
    • même nom
    • mêmes paramètres
    • même type de retour
    La liste des restrictions sur la redéfinition n'est pas complete : il y'a aussi des règles sur le modificateur de visibilité et les exceptions declarées.

    [edit]
    Pour plus de détails, vous pouvez consulter ce topic.

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

Discussions similaires

  1. Mémoriser du texte | Choix de la méthode
    Par madnux dans le forum C++Builder
    Réponses: 9
    Dernier message: 16/05/2007, 14h31
  2. Réponses: 3
    Dernier message: 19/03/2007, 01h19
  3. Polymorphisme : non-reconnaissance de méthode
    Par Chen norris dans le forum C++
    Réponses: 4
    Dernier message: 24/08/2006, 11h52
  4. [Compilation] Choix d'une méthode d'analyse
    Par GrandFather dans le forum Algorithmes et structures de données
    Réponses: 13
    Dernier message: 10/10/2005, 08h34
  5. Choix de la méthode d'update la plus performante
    Par nazap dans le forum Oracle
    Réponses: 3
    Dernier message: 01/02/2005, 13h24

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