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 :

Pourquoi il n'est pas possible d'hériter un constructeur ?


Sujet :

Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2010
    Messages : 123
    Points : 137
    Points
    137
    Par défaut Pourquoi il n'est pas possible d'hériter un constructeur ?
    Bonjour,

    Ma question est simple : lorsque l'on fait un héritage, on est obligé de recréer un constructeur pour la classe fille qui reprend souvent les mêmes paramètres que le constructeur de la classe mère. Pourquoi Java interdit d'utiliser le constructeur de la classe mère ?

    On pourrait avoir par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Class Mere{
         private String s;
         private int a;
     
         public Mere(String str, int nbr){
               this.s = str
               this.a = nbr
         }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Class Fille extends Mere{
        private int b;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public static void main(String[] args) {
    Fille f = new Fille("Coucou", 12); //On utilise le constructeur de la classe mère
    }
    D'avance merci !

  2. #2
    Expert confirmé
    Avatar de slim_java
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2008
    Messages
    2 272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2008
    Messages : 2 272
    Points : 4 539
    Points
    4 539
    Par défaut
    Citation Envoyé par VonDriguen Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Fille f = new Fille("Coucou", 12); //On utilise le constructeur de la classe mère
    D'avance merci !
    salut,
    le constructeur de la classe mère est Mere

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2010
    Messages : 123
    Points : 137
    Points
    137
    Par défaut
    Citation Envoyé par slim_java Voir le message
    salut,
    le constructeur de la classe mère est Mere
    Oui mais si je mets :
    Fille fille = new mere();

    ça revient à faire :
    int i = double b;

    En gros, ça pète !
    Ce que je tente de faire, c'est comme en Delphi c'est à dire: hériter du constructeur de la classe mère. Comme je l'ai déjà dit, je sais que ce n'est pas possible en Java. Ma question c'est : pourquoi ? Qu'est-ce qui a poussé les codeurs du langage à empêcher cela ?

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Points : 653
    Points
    653
    Par défaut
    Je ne connais pas delphi, mais en java, chaque classe doit avoir son propre constructeur.

    Dans l'exemple où une classe Fille hérite de Mere, comment savoir quelle classe je veux instancier si Fille hérite du constructeur de Mere. Car Mere n'est pas forcément une classe abstraite et peut alors être instanciée.

    Si je fais tout simplement :
    Est-ce la classe Mere que je veux instancier, ou bien la classe Fille ? Nous voyons bien que cela pourrait aboutir à des ambiguïtés. Je ne sais pas comment cela est résolu en Delphi.

  5. #5
    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
    un constructeur est spécifique à chaque classe. Par défaut, si tu ne met pas de constructeur dans une classe, le compilateur (et pas la jvm) ajoute un constructeur sans argument donc la seule ligne de code est super().

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par VonDriguen Voir le message
    Comme je l'ai déjà dit, je sais que ce n'est pas possible en Java. Ma question c'est : pourquoi ? Qu'est-ce qui a poussé les codeurs du langage à empêcher cela ?
    Les codeurs n'ont rien empêché du tout, ils n'ont pas ajouté cette possibilité, nuance.

    Je ne suis pas dans leur tête, mais de manière générale Java n'aime pas trop insérer des choses implicitement, dont les développeurs peuvent facilement oublier la présence.
    Le seul constructeur implicite que je connaisse, c'est le constructeur par défaut, et uniquement si aucun constructeur n'est explicitement défini. Pas d'autre constructeur implicite, dans le but, je suppose, d'être très explicite.

    À noter que les constructeurs non privés de la classe mère sont parfaitement hérités (accessibles avec super()). Mais ils ne génèrent pas implicitement de constructeur qui se contente de les appeler.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    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
    L'héritage, ça consiste, finalement, à permettre l'accès aux méthodes du parent depuis l'enfant. Donc quand je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Mere m = new Fille(); 
    m.uneMethode();
    La compilateur va demander garantie que "uneMethode()" est bien présente dans mère
    La JVM, de son coté, va chercher "uneMethode()" dans Fille, puis si pas trouvée dans Mere(). C'est le principe de invokeVirtual

    Dans le cadre d'un constructeur, c'est complètement différent:
    -> On ignore sur quelle instance on travaille puisque l'instance n'existe pas!
    -> on dois donc, comme pour une méthode statique, viser un constructeur bien précise (ici Fille)
    -> contrairement à l'héritage de méthode, le compilateur java devrais obligatoirement générer ces constructeur, sinon impossible de les viser

    Maintenant, imaginons un instant que ces soit fait automatiquement.

    Si demain je change le constructeur de Mere. Fille s'adapterait automatiquement aux nouveaux types des paramètres. Imaginons aussi que Mere et Fille soient deux librairies différentes. Dans ce cas, après recompilation de Fille, je n'ai changé aucun constructeur, juste fait un petit Bugfix, pas d'erreur de compilation. Ce sont mes utilisateurs qui utilisent la librairie Fille qui viendront me voir en disant "Hoooo là, ta nouvelle librairie, tous tes constructeurs ont changé, c'est plus compatible". Autrement dit, l'incompatibilité du au changement de Mere ne se verra pas directement dans ses utilisateurs, mais dans les utilisateurs de sa fille. Et cette chaine pourrait aller loin! C'est une bonne raison, a mon avis, pour ne pas implémenter ce genre de chose.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2010
    Messages : 123
    Points : 137
    Points
    137
    Par défaut
    Merci pour vos réponses.

    Elles m'ont sincèrement éclairé !!!

    Pour ceux que ça intéresse, j'ai également trouvé un excellent complément d'information ici

    Merci à ceux qui se sont penché sur ma question

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

Discussions similaires

  1. Pourquoi getToolkit() n'est pas reconnu
    Par L4BiN dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 26/11/2009, 18h08
  2. Pourquoi Dreamweaver n'est pas un Framework ?
    Par lunick dans le forum Dreamweaver
    Réponses: 1
    Dernier message: 07/10/2008, 18h44
  3. Sélection de texte à l'intérieur d'une cellule. C'est [PAS] possible.
    Par Blackfox dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 20/08/2007, 14h01
  4. Réponses: 3
    Dernier message: 16/05/2006, 16h34
  5. Réponses: 9
    Dernier message: 05/10/2005, 14h50

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