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 :

Liaison statique des classes internes dérivées


Sujet :

Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Février 2009
    Messages : 354
    Points : 491
    Points
    491
    Par défaut Liaison statique des classes internes dérivées
    Le titre peux paraitre un peu flou, je vais essayer d'être claire.

    Voilà j'ai une classe A1, qui englobe une classe interne B, avec une méthode M
    Ensuite j'ai une classe A2 dérivé de A1, qui redéfinit B, et M.

    Si j'instancie A2 en le typant en A1 et que j'appelle la méthode M, alors pas de problème la liaison dynamique(polymorphique) et c'est bien la fonction M de la classe A2 qui est exécute.
    Par contre si j'appel la classe interne B , alors là je me retrouve avec la classe interne de A1. Et le plus étonnant et si je fait un appel à M depuis cette classe interne, il retrouve la liaison dynamique et c'est la méthode M de la classe A2 qui est exécute.

    Par du code ca donne :

    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
    public class Main {
        public static void main(String[] args) throws Exception {
            A1 obj = new A2();
            //appel la méthode M
            obj.M();
            //donne : Méthode M de A2
     
            //initialise la classe interne
            obj.new B();
            //donne : constructeur B de A1 -- Méthode M de A2
            // au lieux de : constructeur B de A2 -- Méthode M de A2
     
            //initialise la classe interne avec un accesseur
            obj.setB();
            //donne : constructeur B de A1 -- Méthode M de A2
            // au lieux de : constructeur B de A2 -- Méthode M de A2
        }
    }
     
    class A1 {
        public class B{
            public B() {
                System.out.println("constructeur B de A1");
                M();
            }
        }
        public void M(){
            System.out.println("Méthode M de A1");
        }
        public void setB(){
            new B();
        }
    }
     
    class A2 extends A1 {
        public class B{
            public B() {
                System.out.println("constructeur B de A2");
                M();
            }
        }
        public void M(){
            System.out.println("Méthode M de A2");
        }
    }
    Quelqu'un pourrait me dire pourquoi ca fait ca, et si il y a un moyen de forcer la liaison dynamique car ca m'embête un peux de revoir l'organisation de mes classes.

    Merci

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    La résolution des constructeurs est faite à la compilation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    A1 obj = ....
    obj.new B();

    Le compilateur stocke, grosso merdo, dans le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    A1 obj = ....
    new A1.B(obj);

    A partir de là, je pense que tu peux comprendre pourquoi il n'y a aucune chance que A2.B ne soit invoqué

    De plus si on imaginais cet héritage, on aurait un problème

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    A1 obj = new A2
    A1.B b = obj.new B(); // Si ça invoquais new A2.B(obj) on aurait un problème car A2.B n'est pas nécessairement castable en A1.B car rien n'oblige A2.B a étendre A1.B

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Février 2009
    Messages : 354
    Points : 491
    Points
    491
    Par défaut
    merci tchize_ toujours là pour servir la cause des noobs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    A1 obj = new A2
    A1.B b = obj.new B(); // Si ça invoquais new A2.B(obj) on aurait un problème car A2.B n'est pas nécessairement castable en A1.B car rien n'oblige A2.B a étendre A1.B
    Ba oui c'est sur !! me sent un peu bête d'un coup mais bon c'est comme ca qu'on apprend merci !!!

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par kimjoa Voir le message
    merci tchize_ toujours là pour servir la cause des noobs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    A1 obj = new A2
    A1.B b = obj.new B(); // Si ça invoquais new A2.B(obj) on aurait un problème car A2.B n'est pas nécessairement castable en A1.B car rien n'oblige A2.B a étendre A1.B
    Ba oui c'est sur !! me sent un peu bête d'un coup mais bon c'est comme ca qu'on apprend merci !!!
    Salut,

    Pour info, si tu veux de la liaison dynamique sur les classes internes, cela existe, et tu peux te tourner vers les classes virtuelles. Elles sont implémentées dans certains langages de recherche (CaesarJ par exemple).
    Bref l'idée est loin d'être bête et a déjà été longuement étudiée !

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Février 2009
    Messages : 354
    Points : 491
    Points
    491
    Par défaut
    cool George7 ! merci pour l'info, je vais regarder ca avec attention
    merci

Discussions similaires

  1. Séparation des classes internes en classes externes
    Par pekre dans le forum NetBeans
    Réponses: 4
    Dernier message: 30/05/2013, 16h06
  2. [POO] Appels statiques sur des classes
    Par daajack dans le forum Langage
    Réponses: 2
    Dernier message: 07/12/2007, 15h47
  3. Réponses: 4
    Dernier message: 27/07/2007, 18h18
  4. [Conception] classes internes ou gestion des events
    Par TTKiBosse dans le forum Général Java
    Réponses: 2
    Dernier message: 06/12/2006, 18h25
  5. Réponses: 6
    Dernier message: 23/02/2006, 20h23

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