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 :

[débutant] Problème polymorphisme,surcharge et héritage


Sujet :

Langage Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2
    Par défaut [débutant] Problème polymorphisme,surcharge et héritage
    Bonjour à tous,

    J'essaye de résoudre une question d'un examen de juin 2003 et j'aurais besoin d'un coup de pouce pour une partie assez tordue du problème ...

    voici le code :

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    class P {
             static void rint (String s) {
                     System.out.println(s);
             }
    }
     
    abstract class A {
             String valueOf(){ return "[A]"; }
             void m(A x, A y){
                     P.rint( "Classe A" );
                     P.rint( valueOf() + x.valueOf() + y.valueOf() );
             }
    }
     
    class B extends A {
             void m(A x, A y){
                     P.rint( "Classe B" );
                     P.rint( "[B]" + x.valueOf() + y.valueOf() );
             }
             void m(A x, B y){ super.m(x, y); }
             void m(B y, A x){ m((A)y, x); }
    }
     
    class C extends B {
             String valueOf(){ return "[C]"; }
             void m(B x, B y){
                     P.rint( "Classe C" );
                     P.rint( "[C]" + x.valueOf() + y.valueOf() );
             }
    }
     
    class appel {
             public static void main(String[] args) {
                     A a = new B();
                     B b = new C();
     
                     P.rint("/ 1 /");
                     a.m(a, b);
                     P.rint("/ 2 /");
                     a.m(b, b);
             //!     b.m(b, b); // génère l'erreur suivante à la compilation :
             // appel.java:43: reference to m is ambiguous, both method m(A,B) in B 
    and method m(B,A) in match b.m(b, b);
             //
             }
    }
    voilà la sortie du programme :

    / 1 /
    Classe B
    [B][A][C]

    Question 1 : Pourquoi la méthode appelée est B.m(A x, A y) au lieu de B.m(A x, B y) ?
    Pourtant dans l'appel de méthode a.m(a, b), le paramètre a est bien de type statique A et b de type statique B !

    / 2 /
    Classe B
    [B][C][C]

    Question 2 : Pourquoi la méthode appelée est B.m(A x, A y) ?
    Dans l'appel de méthode a.m(b, b), les 2 paramètres sont de type statique B, pourquoi Java "upcast"-t-il les 2 paramètres vers le type A de manière à utiliser la méthode B.m(A x,A y) et pas plutôt uniquement le premier paramètre de manière à appeler la méthode B.m(B y,A x) ?

    Question 3 : Si on décommente la ligne b.m(b.b), on obtient l'erreur de compilation mentionnée plus haut. Pourquoi ?
    Comme l'Objet b est de type dynamique C et que les paramètres sont tous les deux de type statique B, Java devrait simplement appeler la méthode C.m(B x, B y) non ?

    J'ai parcouru pas mal de cours et de tutoriels mais je n'ai pas trouvé d'explications précises à ces cas particuliers...

    grand merci pour votre aide,

    effco

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 29
    Par défaut
    Question 1 :
    L’appel est a.m(a,b) où a est déclaré de type A et b déclaré de type B. Comme la class A ne possède qu’une seule méthode m(A,A) et que a est déclaré de ce type c’est cette unique méthode qui sera utilisée. b sera donc casté implicitement en type, A si cela n’était pas possible alors une erreur aurait été générée (les autres méthodes ne sont pas accessibles). Cependant comme a est instanciée de type B (new B()), le code exécuté sera le code de la méthode m(A,A) de B (liaison dynamique).

    Question 2 :
    Idem.
    a est de type A donc il ne connaît que m(A,A). Pour lui m(A,B) et m(B,A) n’existent pas.


    Question 3 :
    non.
    b est de type B donc il ne connaît que m(A,A), m(A,B) et m(B,A). La méthode m(B,B) n’est pas accessible puisqu’elle s’applique aux objets de type C.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2
    Par défaut
    Effectivement... je n'ai pas encore bien assimilé le principe de la liaison dynamique

    J'ai trouvé un lien explicatif assez bien fait :
    http://www.pps.jussieu.fr/~rifflet/J...ontardive.html

    merci du coup de main !!

    effco

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

Discussions similaires

  1. Débutant problème d'héritage (class)
    Par panthere noire dans le forum Débuter
    Réponses: 7
    Dernier message: 08/08/2009, 12h03
  2. Réponses: 6
    Dernier message: 08/02/2008, 14h58
  3. Réponses: 2
    Dernier message: 03/10/2007, 14h59
  4. Débutant, problème de surcharge
    Par guidevelop dans le forum C++
    Réponses: 5
    Dernier message: 06/11/2006, 14h28
  5. Réponses: 11
    Dernier message: 02/09/2003, 14h20

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