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 :

héritage - ne pas appeler le constructeur de Superclass


Sujet :

Langage Java

  1. #1
    Membre averti Avatar de Javix
    Inscrit en
    Juin 2007
    Messages
    531
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 531
    Points : 353
    Points
    353
    Par défaut héritage - ne pas appeler le constructeur de Superclass
    J'ai découvert un comportement un peu bizarre en cas de héritage.
    Voici mon cas.
    J'ai une class B qui est soous-class de class A.
    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
     
    public class A extends SuperClass
     
    public A(){
    je fait mes trucs ici
    }
    end
     
    class B extends A {
     
    public B() {
    //super() - pas besoin de constructeur ses trucs de super class
    je fait mes trucs ici
    }
    }
    je pensais toujours que si on n'appelle pas 'super' dans le constructeur de sous-class, alors celi une sera jamais appelé; Mais justement - c'est la cas; Même si je ne le fais pas il est appelé quand même.
    Est-ce qu'il y a un moyen de contourner ça?

  2. #2
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    En cas d'absence, super() est implicite et tu ne peux pas changer cela.

    Quels sont les raisons qui t'amène à vouloir cela ?

    a++

  3. #3
    Invité
    Invité(e)
    Par défaut
    Juste pour confirmation, l'appel implicit de super() n'est valable que pour le constructeur?

    Une méthode défini dans A et redéfini dans B sans faire super.maMethode() ne fera pas le code contenue dans la méthode de la super classe?

  4. #4
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Mr_LoOnY Voir le message
    Juste pour confirmation, l'appel implicit de super() n'est valable que pour le constructeur?
    Seulement pour les constructeurs, car pour qu'une classe soit correctement initialisé il faut que les constructeurs des classes parentes soient exécutés...



    Citation Envoyé par Mr_LoOnY Voir le message
    Une méthode défini dans A et redéfini dans B sans faire super.maMethode() ne fera pas le code contenue dans la méthode de la super classe?
    C'est tout à fait cela

    a++

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    En cas d'absence, super() est implicite et tu ne peux pas changer cela.
    Ha bon ? oO
    Ben j'en apprends tout les jours !
    Merci !

    Ps : et s'il n'est pas défini ?
    ça appelle celui de Object ?

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 566
    Points : 21 632
    Points
    21 632
    Par défaut
    Citation Envoyé par PierreD87 Voir le message
    Ps : et s'il n'est pas défini ?
    ça appelle celui de Object ?
    Oui. Plus exactement, il est toujours défini. Si aucun constructeur n'est défini, c'est comme s'il y en avait un qui ne prend pas de paramètre et fait juste super();

  7. #7
    Membre averti Avatar de Javix
    Inscrit en
    Juin 2007
    Messages
    531
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 531
    Points : 353
    Points
    353
    Par défaut
    Au départ il n'était pas prévu que la classe en question soit sous-classée. Maintenant pour éviter de faire 100% copier-coller je voulais juste sous-classer cette classe et ne faire que 'overide' de méthodes qui m'intéressent. Et c'est là que je me suis rendu compte de cette inconvenance, - dans le constructeur de la classe de base il y a quelques initialisations qui automatiquement 'se propagent' au moment de création de ma sous-classe. Et si j'essaye de créer un autre constructeur dans la classe de base qui prend un paramètre, par ex. boolean et puis je testerai cette valeur et appelerai le constructeur sans paramètre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public class A
    public A () {
    ...
    }
    public A (boolean isForSubClass) {
    if (! isForSubClass) {
      this()
    }
    else {
    mon processing comes here
    }
    end
    Je ne l'ai paas encore testé, c'est juste une proposition.... Une autre idée ?

  8. #8
    Invité
    Invité(e)
    Par défaut
    Le plus propre ne serait-il pas de créer une autre classe par dessus A et B ?

    appelons la AA tu y mets les méthodes communes aux autres classes avec un constructeur vide AA(){};

    puis dans A tu pourras créer ton constructeur et dans B aussi?

  9. #9
    Membre averti Avatar de Javix
    Inscrit en
    Juin 2007
    Messages
    531
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 531
    Points : 353
    Points
    353
    Par défaut
    Non, voici comment je vais faire si je ne trouve quelque chose de meilleur:
    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
     
    public class A {
     
    	public A() {
    		System.out.println("In constructor without parameters");
    	}
     
    	public A(boolean flag) {
    		System.out.println("In constructor with parameters");
     
    	}
     
    }
     
    public class B extends A {
     
    	public B(){
    		super(true);
    		System.out.println("In B constructor");
    	}
     
    }
     
    public class TestAB {
     
    	/**
             * @param args
             */
    	public static void main(String[] args) {
    		B b = new B();
     
    	}
     
    }
    Le résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    In constructor with parameters
    In B constructor
    Dans le constructeur avec un paramètre de classe A on peut passer n'importe quoi - c'est juste pour éviter l'appel de celui sans paramètres et pourvue qu'il soit différent de celui-là.

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

Discussions similaires

  1. Héritage: comment appeler le constructeur parent ?
    Par scheme dans le forum Langage
    Réponses: 22
    Dernier message: 24/02/2011, 17h55
  2. Héritage et appel des constructeurs parents
    Par Antoine_935 dans le forum Débuter
    Réponses: 7
    Dernier message: 13/05/2009, 18h03
  3. [JUnit] Classe de test avec héritage et appel du constructeur
    Par LuckyLiam dans le forum Tests et Performance
    Réponses: 2
    Dernier message: 23/04/2009, 09h36
  4. [POO-Héritage] Appel du constructeur en PHP4.3.2
    Par raoulchatigre dans le forum Langage
    Réponses: 4
    Dernier message: 28/11/2005, 15h37
  5. [héritage privé] appel du constructeur de base
    Par PINGOUIN_GEANT dans le forum C++
    Réponses: 4
    Dernier message: 19/10/2004, 14h05

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