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 :

[Language][POO]De l'usage de super


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de afrikha
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 600
    Par défaut [Language][POO]De l'usage de super
    Supposons qu'une classe C etend une classe B qui elle-meme etend une classe A.Supposons aussi que les classes A et B possedent une methode nommée affiche() par exemple.
    Si dans une methode de la classe C,je mets
    est-ce que ça fait reference à la methode affiche() de la classe B ou bien à celle de A?
    Si c'est celle de B,comment on fait pour acceder à la methode affiche() de la classe A? est-ce qu'il faut faire A.affiche()?Dans ce cas,on peut se passer de super en faisant classeMere.methode(),non?

    Merci de votre aide


    P.S: oui je sais que c'est un peu prise de tete....


    Mes publications
    Lisez
    Les régles du forum
    Pensez au bouton

  2. #2
    Membre confirmé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2005
    Messages : 29
    Par défaut
    Si tu utlises l'héritage et là c'est visiblement le cas, obligatoirement ta classe C fera appel à la methode affiche de ta classe B.
    Si tu veux utiliser la methode affiche de ta classe A dans ta classe C il faut
    - que tu insancies un nouvel objet de ta classe A comme tu le décris
    - que tu definnisses un autre nom de methode dans ta classe A afficheA() qui fait la meme chose que A
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void afficheA() { affiche();}
    mais que tu ne redéfinit pas dans B
    (ou tout autre facon d'appeler une methode de classe)
    exemple :
    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
    public class A {
     
            public A() {
            }
            public void affiche() {
                    System.out.println("A");
            }
    }
    public class B extends A{
     
            public B() {
                    super();
            }
            public void affiche() {
                    System.out.println("B");
            }
    }
    public class C extends B{
     
            public C() {
                    super();
                    affiche();
                    super.affiche();
                    (new A()).affiche();
     
            }
            public static void main(String args[]) {
                    new C();
            }
    }
    donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    [tmp]# java C
    B
    B
    A
    C.

  3. #3
    Membre Expert
    Avatar de afrikha
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 600
    Par défaut
    merci pour tes explications.Juste une derniere chose
    est-il possible de replacer
    par
    ?


    Mes publications
    Lisez
    Les régles du forum
    Pensez au bouton

  4. #4
    Membre chevronné
    Avatar de Glob
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Avril 2002
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Avril 2002
    Messages : 428
    Par défaut
    Hello.

    A.affiche() est possible ssi affiche() est une méthode de classe (static).

  5. #5
    Membre Expert
    Avatar de afrikha
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 600
    Par défaut
    d'accord.
    il n'y a donc aucune autre alternative à part créer un objet pour utiliser la méthode affiche() de A?


    Mes publications
    Lisez
    Les régles du forum
    Pensez au bouton

  6. #6
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Ce que tu veux faire est peu courant car si tu herites de B c'est que tu veux le comportement fourni par B et non pas A. Peut-etre pourrais-tu heriter de A a la place ?

  7. #7
    Membre Expert
    Avatar de afrikha
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 600
    Par défaut
    Citation Envoyé par Gfx
    Ce que tu veux faire est peu courant car si tu herites de B c'est que tu veux le comportement fourni par B et non pas A. Peut-etre pourrais-tu heriter de A a la place ?
    oui oui je sais, tu as tout à fait raison,mais c'est une question que je me pose par curiosité et non un problème que j'ai rencontré en pratique


    Mes publications
    Lisez
    Les régles du forum
    Pensez au bouton

  8. #8
    Membre éprouvé
    Inscrit en
    Avril 2003
    Messages
    159
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 159
    Par défaut
    Un petit doute, mais si tu cast super en A ca ne marche pas ?

  9. #9
    Membre Expert
    Avatar de afrikha
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 600
    Par défaut
    Citation Envoyé par bourbaki2003
    Un petit doute, mais si tu cast super en A ca ne marche pas ?
    en fait je n'ai pas ecrit de code
    tu veux dire mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (A)super.affiche()
    c'est possible ça?


    Mes publications
    Lisez
    Les régles du forum
    Pensez au bouton

  10. #10
    Membre éprouvé
    Inscrit en
    Avril 2003
    Messages
    159
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 159
    Par défaut
    J'ai pas testé mais je vois pas de problème à faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ((A) super).affiche();
    Mais comme j'ai dit j'ai pas testé.

  11. #11
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Ca ne compilera pas.

  12. #12
    Membre éprouvé
    Inscrit en
    Avril 2003
    Messages
    159
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 159
    Par défaut
    Je ne remets pas tes compétences en doute, mais tu es sur ? Pourquoi on ne pourrait pas caster super, au final ce n'est qu'un objet.

  13. #13
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Parce que super est deja un A donc le caster n'aurait aucune difference. En C# oui car tu peux "effacer" la methode parente par la tienne (comme en Java) ou conserver les deux (a ce moment la tu peux caster ton objet en A et avoir un resultat diffrent). Enfin essaye de compiler ca tu verras bien

  14. #14
    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 bourbaki2003
    Pourquoi on ne pourrait pas caster super, au final ce n'est qu'un objet.
    Le fait de caster un objet ne change rien car la méthode a appellé est déterminé selon le type réel de l'objet...


    Mais pourquoi as-tu besoin de faire cela ?

    a++

  15. #15
    Membre confirmé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2005
    Messages : 29
    Par défaut
    Citation Envoyé par adiGuba
    Le fait de caster un objet ne change rien car la méthode a appellé est déterminé selon le type réel de l'objet...
    En effet j'ai fait le test :
    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
    public class A {
            public A() {
            }
            public void affiche() {
                    System.out.println("A");
            }
    }
    public class B extends A{
            public B() {
                    super();
            }
            public void affiche() {
                    System.out.println("B");
            }
    }
     
    public class C extends B{
            public C() {
                    super();
                    ((A)this).affiche();
            }
            public static void main(String args[]) {
                    new C();
            }
    }
    ca compile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [ tmp]# javac -classpath . C.java
    [ tmp]#
    Et sa renvoie ... :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [ tmp]# java C
    B
    [ tmp]#
    Et hop

  16. #16
    Membre Expert
    Avatar de afrikha
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 600
    Par défaut
    euh,si je comprends bien,le cast mème si il compile ne marche pas puisqu'il y a appel à affiche() de B et non de A :


    Mes publications
    Lisez
    Les régles du forum
    Pensez au bouton

  17. #17
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Que tu fasses this.affiche() ou ((A) this).affiche() tu appelleras toujours la methode affiche() la plus proche de ta classe C. Dans ce cas ca affiche B, comme si tu avais fait super.affiche() ou tout betement this.affiche(). Essaye en surchargeant affiche() dans C et tu verras que tu obtiendras l'affichage de la chaine "C".

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 20/07/2010, 15h40
  2. [POO] Classe PHP super simple Mais j'y arrive pas
    Par mulbek dans le forum Langage
    Réponses: 10
    Dernier message: 17/03/2006, 15h33
  3. Réponses: 8
    Dernier message: 18/07/2005, 18h38
  4. [Language][POO]classe interface
    Par Samanta dans le forum Langage
    Réponses: 9
    Dernier message: 21/06/2005, 15h32
  5. je veux apprendre la programmation quel language choisir??
    Par existance dans le forum Débuter
    Réponses: 26
    Dernier message: 06/08/2002, 05h32

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