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

Java Discussion :

Appel d'une méthode sur une classe avec héritage


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Devops
    Inscrit en
    Août 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Devops
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2013
    Messages : 6
    Par défaut Appel d'une méthode sur une classe avec héritage
    Bonjour,

    Tout d'abord, désolé pour le titre confus, je ne sais trop comment intituler correctement ce soucis...
    Prenons l'exemple suivant :
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    package test;
     
    public class ExtendsStaticTest
    {
     
        /**
         * @param args
         */
        public static void main(String[] args)
        {
            B.foo();
            A.getB().foo();
        }
    }

    Code Java : 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
     
    package test;
     
    public class A
    {
     
        protected static void foo()
        {
            System.out.println("bar");
        }
     
        public static A getB()
        {
            return new B();
        }
    }

    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    package test;
     
    public class B
        extends A
    {
        protected static void foo()
        {
            System.out.println("barB");
        }
    }

    Selon moi, l'appel à A.getB() me retourne une instance de B, instance dont la classe hérite de A.
    A.getB().foo() fait cependant appel à la méthode de la classe A...

    Pourquoi et comment faire pour que ce soit la méthode B.foo() qui soit appelée ?


    Le soucis réel caché derrière cet ECM est qu'au lieu d'avoir A.getB(), j'ai A.getUneClasse() dont le retour peut être soit une instance de A, soit une instance de B; où B s'agirait d'une classe surchargée par un utilisateur.


    Avez vous des explications à me fournir sur ce comportement que je ne comprends pas ?

    Merci

  2. #2
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    Le polymorphisme ne s'applique pas dans le cas de méthodes statiques. C'est le type déclaré à la compilation qui est exécuté, pas le type réel.

    Early binding vs late binding ==> le static est linké, figé dans le marbre, au moment de la compilation. Tout comme d'ailleurs le polymorphisme paramètrique (avoir 2 signatures void foo(Object o) et void foo(String s), que se passe-t-il quand on invoque avec une variable de type Object qui contient en réalité une String??)


  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Devops
    Inscrit en
    Août 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Devops
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2013
    Messages : 6
    Par défaut
    Merci pour ta réponse.
    Du coup, si je te comprends bien, le soucis est lié au fait que ma méthode A.getB() soit statique...

    Admettons que je crée la fonction suivante dans la classe A

    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        public A getBNoStatic()
        {
            return new B();
        }

    L'appel à new A().getBNoStatic().foo(); ne devrait-il pas alors valoir la même chose que B.foo(); ?
    Pourtant cela me renvoie vers A.foo();

    J'ai actuellement la main sur getB() de la classe A ainsi que sur la classe B.
    Par contre, je n'ai pas la main sur le reste de la classe A pour raison de rétrocompatibilité...
    foo() est une méthode statique et je ne peux pas le modifier.

    Merci


    Edit : Pas sûr d'avoir tapé à coté de ton explication... en fait, A.getB() pourrait ou non être statique on s'en fiche mais c'est foo() qui, étant statique, empêche d'appeler correctement A.foo() ou B.foo() ?

    Ai-je un moyen de faire autrement ?

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Hello

    Citation Envoyé par SasakiKojiro Voir le message
    [...] en fait, A.getB() pourrait ou non être statique on s'en fiche mais c'est foo() qui, étant statique, empêche d'appeler correctement A.foo() ou B.foo() ?
    Yup. Cela dit, c'est une mauvaise chose d'appeler A.getB(). Une méthode statique s'appelle en fonction de son nom de classe, pas d'un objet.

    Citation Envoyé par SasakiKojiro Voir le message
    Ai-je un moyen de faire autrement ?
    B.foo(), et puis c'est tout. De toute façon c'est elle que tu veux appeler, pas une autre, alors pourquoi chercher ailleurs ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    Tu pourrais forcer via un cast, mais c'est moche... ((B)A.getBNoStatic()).foo()En plus c'est vrai, si c'est statique, faut invoquer de manière statique... en référençant la classe et pas une instance

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Devops
    Inscrit en
    Août 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Devops
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2013
    Messages : 6
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Hello
    B.foo(), et puis c'est tout. De toute façon c'est elle que tu veux appeler, pas une autre, alors pourquoi chercher ailleurs ?
    Par défaut, la classe A existe et est la référence. Il se peut que pour un besoin spécifique, l'utilisateur ait définit une classe B et souhaite ne pas appeler A.foo() mais B.foo()
    Donc s'il a défini B, je dois utiliser B.
    Au final, je sais seulement que je vais appeler la méthode foo() mais pour certains utilisateurs ça viendra de A, pour d'autre de B.

    Citation Envoyé par Pill_S Voir le message
    Tu pourrais forcer via un cast, mais c'est moche... ((B)A.getBNoStatic()).foo()En plus c'est vrai, si c'est statique, faut invoquer de manière statique... en référençant la classe et pas une instance
    Pareil, si je force le cast, j'empêche le fait de pouvoir avoir A.foo().
    Je suis désolé, je suis pas vraiment clair... J'avais expliqué que je n'ai pas vraiment de A.getB() mais un A.getUneClasse() et que, si l'utilisateur a défini la classe B, la méthode me retourne B; A sinon.

    A n'étant pas un B, ((B)A.getBNoStatic()).foo() me renverra une classCastException

Discussions similaires

  1. [WD18] Metre une colonne d'une Table sur une ligne d'une autre Table
    Par Totophe2 dans le forum WinDev
    Réponses: 2
    Dernier message: 22/11/2013, 12h58
  2. Problème de thread sur une méthode d'une classe C++
    Par yoshi84300 dans le forum Threads & Processus
    Réponses: 5
    Dernier message: 12/03/2013, 11h23
  3. Appel d'une méthode sur une classe fille
    Par Tipha dans le forum C++
    Réponses: 5
    Dernier message: 29/05/2008, 14h23
  4. Réponses: 6
    Dernier message: 05/03/2008, 20h53
  5. Réponses: 6
    Dernier message: 20/04/2007, 15h24

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