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 :

Liaison dynamique - Tardive


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté Avatar de lapanne
    Inscrit en
    Juin 2006
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 200
    Par défaut Liaison dynamique - Tardive
    Bonjour,

    Alors j'ai eu un examen au CNAM hier soir et je me posé une petite question.

    Le contexte :

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    public interface Tache
    {
         string getNom();
         int getCout();
    }
     
    public class TacheElementaire implements Tache
    {
         public string getNom()
        {
             ...
        }
     
         public int getCout()
        {
             ...
        }
    }
     
    public class TacheComplexe implements Tache
    {
         public string getNom()
        {
             ...
        }
     
         public int getCout()
        {
             ...
        }
    }
     
    public class Handler
    {
     
          public Handler()
          {
              ArrayList<Tache> myListTache = new ArrayList<Tache>();
              myListTache.add(new TacheComplexe());
              myListTache.add(new TacheElementaire());
     
              for(Tache tache in myListTache)
              {
                    this.print(tache);
              }
          }
     
          public void print(TacheComplexe tc)
          {
             system.out.println("Tache Complexe !");
          }
     
           public void print(TacheElementaire te)
          {
             system.out.println("Tache Elementaire !");
          }
     
           public void print(Tache t)
          {
             system.out.println("Tache !");
          }
     
    }
    Alors moi, je dis que print(Tache tache) ne sera jamais appelé car, à cause de la lisaison dynamique à l'éxécution, tache est forcément soit un TacheComplexe soit un TacheElementaire, donc une des deux autres méthodes sera appelé et que donc le résultat de ceci est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TacheComplexe !
    Tache Elementaire !
    Une pote me soutient que, non, ça sortira ceci :

    J'ai bon ? Ou pas ?

    Edit : bon ben j'ai écrit le code, j'ai compilé et j'ai éxécuté. Mon pote a raison, j'ai bien Tache ! Tache !.
    Donc j'ai rien pigé à la liaison dynamique. Donc j'ai perdu au moins 2 pts.

  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 lapanne Voir le message
    Une pote me soutient que, non, ça sortira ceci :

    Ton pote à raison !
    Si la liaison se fait bien à l'exécution, c'est le compilateur qui définit la signature de méthode a appeler...

    Ainsi dans ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(Tache tache : myListTache)
              {
                    this.print(tache);
              }
    Le compilateur génère un appel de méthode sur la signature print(Tache).


    a++

    PS : C'est quelquechose qui se vérifie facilement en testant le code...

  3. #3
    ndp
    ndp est déconnecté
    Membre expérimenté Avatar de ndp
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 227
    Par défaut
    Salut,

    du fait de l'overloading de methode:
    public void print(TacheComplexe tc)
    public void print(TacheElementaire te)
    public void print(Tache t)

    le compilateur fait une liaison statique pour determiner quelle est la methode appele. Commme tes objet sont declarer de type Tache c'est la 3eme methode qui est appelee.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2006
    Messages : 80
    Par défaut
    Hello,

    Es-tu sur que tu ne dois pas utiliser l'héritage afin de faire du polymorphisme paramétré.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public class TachePrinter{
          public void print(Tache t)
             ....
    }
     
    public class TacheComplexePrinter extends TachePrinter{
          public void print(TacheComplexe t)
             ....
    }
     
    ...
    Oui, c'est un peu lourd, je n'ai pas trouvé d'autres formes mais le fond est la.

  5. #5
    Expert confirmé
    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
    Par défaut
    Bonjour,
    Tu confonds redéfinition (override) et surcharge (overload).
    Dans ton exemple, il s'agit d'overload, pas de override, donc pas de liaison dynamique ladedans.

    P.S: And Suit'up !


    [edit]
    Grillé ... mais vraiment vraiment grillé

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Pour bien voir que c'est le compilo comme le disent les autres membres, commente la méthode print(Tache...) et tu verras

  7. #7
    Membre expérimenté Avatar de lapanne
    Inscrit en
    Juin 2006
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 200
    Par défaut
    N'en jetez plus, je me rends
    Merci à tous pour vos réponses, aprés quelques lectures, je saisi un -peu mieux- le concept.

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

Discussions similaires

  1. [1.5] Ellipse et liaison dynamique
    Par bulbo dans le forum Langage
    Réponses: 4
    Dernier message: 29/09/2006, 20h09
  2. Liaison dynamique !
    Par Franck.H dans le forum Linux
    Réponses: 2
    Dernier message: 16/08/2006, 15h25
  3. Liaison dynamique et vitesse des programmes
    Par sebzinzin dans le forum Langage
    Réponses: 2
    Dernier message: 11/04/2006, 10h51
  4. Problème de liaison dynamique...
    Par Franck.H dans le forum Linux
    Réponses: 13
    Dernier message: 24/06/2005, 19h45
  5. [xsl]simuler le mecanisme OO de "liaison dynamique"
    Par philemon_siclone dans le forum XSL/XSLT/XPATH
    Réponses: 10
    Dernier message: 19/12/2003, 12h34

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