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 :

[Heritage] Gestion des constructeurs


Sujet :

Langage Java

  1. #1
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut [Heritage] Gestion des constructeurs
    Quand on cree un constructeur d'une classe derivant d'une autre classe, est il obligatoire d'appeler le constructeur de ladite classe avec super ?

    Sous delphi, un appel au constructeur parent etait vivement recommandé.
    Ici aussi ?

    Quels sont les regles de creation des constructeur et des appels a super ?

    Merci.
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  2. #2
    Membre éclairé Avatar de g_rare
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 608
    Points : 683
    Points
    683
    Par défaut
    Si le "construteur parent" est un constructeur sans paramètre (et seulement dans ce cas), il est automatiquement appelé avant toute ligne de code dans le "constructeur fils" : sauf si bien-sûr cet appel "super()" au constructeur-parent sans paramètre est présent dans le constructeur-fils (ce qui est conseillé pour être cohérent avec les autres appels du type "super(a,b)").
    " Jag blev dömd för fildelning och allt jag fick var en sketen t-shirt. " (tankafritt.nu)
    PAS DE REPONSE PAR MESSAGE PRIVE ! Penser au bouton Résolu en bas de la discussion...

  3. #3
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    donc en fait pour etre coherent, il est preferable que dans chaques constructeurs je fasse appel a super() ou super(...) qu'il s'agissent de classes "extends" ou de classe de base (qui par defaut doivent "extends" une classe mere "Object" non ?) ?

    Si c'est le cas, ca reste coher"ent par rapport a ma conception sous delphi.
    Je prefere expliciter les appels d'ailleur que de laisser faire
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  4. #4
    Membre éclairé Avatar de g_rare
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 608
    Points : 683
    Points
    683
    Par défaut
    Citation Envoyé par Clorish
    classe de base (qui par defaut doivent "extends" une classe mere "Object" non ?)
    Exactement ; mets donc des appels explicites partout (ton code sera plus lisible pour les personnes qui ignoreraient la règle d'appel automatique).

    Pense à cliquer sur le bouton en bas de la discussion.
    " Jag blev dömd för fildelning och allt jag fick var en sketen t-shirt. " (tankafritt.nu)
    PAS DE REPONSE PAR MESSAGE PRIVE ! Penser au bouton Résolu en bas de la discussion...

  5. #5
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    ok merci
    Dans ce cas je prefere aussi

    Citation Envoyé par g_rare
    Pense à cliquer sur le bouton en bas de la discussion.
    pas de problemes je suis un habitué
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  6. #6
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    petite precision :
    Je suppose que en l'absence de constructeur, on herite des constructeurs du parents non ?

    de meme que toutes classe possede un constructeur vide par defaut ? ou bien faut il le creer si on le veux ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Parent : 
    public MaClasse(Int a, int b)
     
    Creation instance fille sans constructeur defini dans ClassFille
    ClassFille cf = new ClassFille();
    ClassFille cf = new ClassFille(1, 2);
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  7. #7
    Membre éclairé Avatar de g_rare
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 608
    Points : 683
    Points
    683
    Par défaut
    Citation Envoyé par Clorish
    Je suppose que en l'absence de constructeur, on herite des constructeurs du parents non ?
    NON : sans héritage explicite (constructeur dans la classe fille), on hérite uniquement du constructeur sans paramètre (de la classe mère) et uniquement s'il est "protected" ou "public".

    Citation Envoyé par Clorish
    de meme que toutes classe possede un constructeur vide par defaut ?
    Puisque toute classe hérite de "Object" alors elle hérite de son constructeur sans paramètre.

    Citation Envoyé par Clorish
    ou bien faut il le creer si on le veux ?
    A l'inverse si dans la classe mère le constructeur sans paramètre est de visibilité "private" ou sans modificateur (en fait s'il n'est ni "public" ni "protected") alors il sera <<INhéritable>> par la classe file.

    " Jag blev dömd för fildelning och allt jag fick var en sketen t-shirt. " (tankafritt.nu)
    PAS DE REPONSE PAR MESSAGE PRIVE ! Penser au bouton Résolu en bas de la discussion...

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 145
    Points : 125
    Points
    125
    Par défaut
    En l'absence de constructeur, seul le constructeur par défaut (sans arguments) est disponible.
    Dans ton exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ClassFille cf = new ClassFille(1, 2);
    ne marchera pas.
    Tu dois déclarer ce constructeur explicitement. Mais si tu le fais, le constructeur par défaut ne sera plus disponible. Il faudra que tu le déclares aussi explicitement.

  9. #9
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    ok .... chaud

    Derniere chose : LE constructeur qui est declare sans "public" "private", etc ... n'est pas heritable vous dites ?
    mais il peut etre redefini quand meme ?

    Sous delphi les cosntructeurs sont de la sorte :
    Citation Envoyé par delphi
    constructor monconstructeur; => statique, non surchargeable
    constructor monconstructeur; virtual; => dynamique, surchargeable;
    cosntructeur mon constructeur; override; => constructeur surchargé
    donc en gros si j'ai :
    ClasseMere : constructor monconstructeur;
    classe fille : constructor moncosntructeur;
    la classe fille redefini un constructeur qui masque celui de la classe mere mais dont on peut faire appel depuis la classe fille via inherited (ie super)

    L'idee est que si le constructeur est que ainsi, on peut supprimer un constructeur sans parametre pour le remplacer par un constructeur avec parametres dans la classe fille tout en beneficiant des initialisation de la classe mere.

    par contre :
    ClasseMere : constructor monconstructeur; virtual;
    permet de transferer l'appel a ce constructeur a la classe fille ... donc :
    ClasseMere : constructor monconstructeur; virtual;
    classe fille : constructor moncosntructeur(a, b : Integer);
    a pour effet de fournir 2 constructeur different a ClasseFille sans que le 2e ne "masque" le premier. D'ailleur il manque des directive "overload" pour permettre la declaration multiple de fontions de meme noms mais la je m'egare

    Donc l'equivalent sous java c'est ?
    je suppose un constructeur sans "public" ou "private" pour la declaration statique et avec si on veux qu'il soit surchargeable ?
    D'autre part la transmission est automatique (de tous les constructeurs) si je ne defini pas de constructeurs, sinon il faut tous les redefinir. C'est bien ca ?

    un ou 2 petits exemples concret serait bien
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  10. #10
    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,

    Citation Envoyé par Clorish
    Derniere chose : LE constructeur qui est declare sans "public" "private", etc ... n'est pas heritable vous dites ?
    mais il peut etre redefini quand meme ?
    En fait en Java il n'y a pas de notion d'héritage sur les constructeur, ni de redéfinition comme cela semble être le cas en Delphi...

    Ici il est plutôt question de visibilité...

    Chaque classe défini ses propres constructeurs comme bon lui semble, mais en respectant ces quelques règles :
    • Tout constructeur doit impérativement débuter par un appel a un des constructeur parent (via super() - si ce n'est pas précisé un appel implicite au constructeur vide de la classe parente est effectué) ou à un autre constructeur de la même classe (via this()).
    • Chaque classe doit obligatoirement comporter au minimum un constructeur. Si aucun constructeur n'est spécifié, un constructeur vide est automatiquement généré par le compilateur.
    • Enfin l'appel au constructeur parent respecte les mêmes règles de visibilités que les méthodes :
      • S'il est public, il pourra être appelé par n'importe quelle classe.
      • S'il est protected, il pourra être appelé que par les classes filles (ce qui est forcément le cas lorsqu'on hérite) ou les classes du mêmes package.
      • S'il est "package-only" (pas de mot-clef), il pourra être appelé par les classes du même package.
      • Enfin, s'il est private, il ne pourra être appelé que par la classe elle-même ou une classe interne/anonyme.



    Je ne sais pas si c'est clair...

    a++

  11. #11
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Citation Envoyé par adiGuba
    • Tout constructeur doit impérativement débuter par un appel a un des constructeur parent (via super() - si ce n'est pas précisé un appel implicite au constructeur vide de la classe parente est effectué) ou à un autre constructeur de la même classe (via this()).
    • ok. ca je maitrise, c'ets ma facon de faire sous Delphi.
      L'explicite est plus sur que l'implicite.
      Note : On peu quand meme commencer certaines initialisation avant l'appel de super si besoin est ? par contre je suppose que comme sous delphi il y aura une erreur tant que super n'est pas appelé si on touche aux variables d'instances ....

      Citation Envoyé par adiGuba
    • Chaque classe doit obligatoirement comporter au minimum un constructeur. Si aucun constructeur n'est spécifié, un constructeur vide est automatiquement généré par le compilateur.
    ok .. ce cas ne se posera pas ... je prefere controler ce qui se passe.

    Citation Envoyé par adiGuba
  12. Enfin l'appel au constructeur parent respecte les mêmes règles de visibilités que les méthodes :
    • S'il est public, il pourra être appelé par n'importe quelle classe.
    • S'il est protected, il pourra être appelé que par les classes filles (ce qui est forcément le cas lorsqu'on hérite) ou les classes du mêmes package.
    • S'il est "package-only" (pas de mot-clef), il pourra être appelé par les classes du même package.
    • Enfin, s'il est private, il ne pourra être appelé que par la classe elle-même ou une classe interne/anonyme.
Citation Envoyé par adiGuba
ok.
Donc par defaut, tous les constructeurs sont supprimés.
Ca m'arrange car j'ai un mal fou a me debarasser de certains constructeurs de classes parents sous delphi, qui n'on plus de sens dans la classe fille.


Citation Envoyé par adiGuba
Je ne sais pas si c'est clair...
Tres

Merci !


a++[/QUOTE]
On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
--
Pourquoi tant de haine pour cette pauvre aide Delphi ????
Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
--
Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  • #12
    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 Clorish
    Note : On peu quand meme commencer certaines initialisation avant l'appel de super si besoin est ? par contre je suppose que comme sous delphi il y aura une erreur tant que super n'est pas appelé si on touche aux variables d'instances ....
    Non ! L'appel à super() ou this() doit obligatoirement correspondre à la première instruction... C'est malheureusement parfois un peu gênant.

    a++

  • #13
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    ok. Effectivement c'est restrictif.
    D'un autre cote, on doit pouvoir faire appel a des methodes static qui renseigne des variables static avant un appel au constructeur ?

    Le but etant juste de faire des constructeur paramétré.
    Je ne dit pas que j'en aurais besoin, mais des fois ca m'a rendu service.
    Erreur de conception ou pas .... ca c'est une autre histoire

    merci de toutes ces infos
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  • + Répondre à la discussion
    Cette discussion est résolue.
    ActualitésFAQs JavaTutoriels JavaLivres JavaSources JavaOutils, EDI & API JavaJavaSearch

    Discussions similaires

    1. [POO] Constructeur et gestion des accès
      Par olivier69 dans le forum Langage
      Réponses: 1
      Dernier message: 08/08/2010, 12h30
    2. [reseaux] Gestion des threads en perl
      Par totox17 dans le forum Programmation et administration système
      Réponses: 2
      Dernier message: 28/11/2002, 09h40
    3. Gestion des variables - mémoire ?
      Par RIVOLLET dans le forum Langage
      Réponses: 4
      Dernier message: 26/10/2002, 12h44
    4. Réponses: 4
      Dernier message: 04/07/2002, 12h31
    5. c: gestion des exceptions
      Par vince_lille dans le forum C
      Réponses: 7
      Dernier message: 05/06/2002, 14h11

    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