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 :

[Débutant(e)] toString + classes abstraites


Sujet :

Langage Java

  1. #1
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut [Débutant(e)] toString + classes abstraites
    bonjour a tous,
    j'ai quelques questions en java (je débute)

    1) qd on redefinit toString ds une classe, et qu'on veut ecrire les valeurs des attributs de cette classe, doit on utiliser :
    - this.nom_attribut
    - nom_attribut
    - getnom_attribut()
    ?

    j'ai testé les 3, les 3 fonctionnent. mais que vaut il mieux utiliser?

    exemple:
    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 maclasse{
       private int attribut1;
       //constructeur
       //plusieurs methodes
       public String toString(){
        return ("la valeur de l'attribut est "+attribut1);  
                                                       //ou getattribut1() ou this.attribut1
     
      }
     
      //accesseurs




    2) en ce qui concerne les methodes, si ds la classe mere, j'ai une methode1(), la classe fille en herite. Ds le toString de la classe fille, j'ecris:
    - nom_methode()
    - this.nom_methode()
    - super.nom_methode()
    ?

    exemple:
    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
     
     
    public class classemere{
           //attributs
           //constructeurs
           public int surface(){
             return 2*attribut1;
           }
     
           public String toString(){
             return ("la surface est "+this.surface());   //ou surface() ?
           }
    }
     
     
    public class classefille extends classemere{
        //attributs
        //constructeurs
        public String toString(){
           return super.toString();     
     //je sais que c'est bon mais a t-on le droit d'ecrire:
           return ("la surface de l'attribut de la classe fille est "+ this.surface());
           // ou super.surface()    ou    surface()
    }

    3) ds ttes les classes, il faut un constructeur vide . doit on ecrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public constructeur(){}
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public constructeur(){
    int attribut1=0;
    String attribut2="";
    }



    4) derniere question: un de mes profs dit qu'une classe abstraite contient au moins une methode abstraite et qu'elle possede un constructeur. Un autre de mes profs dit qu'une classe abstraite n'est pas obligé de contenir de methodes abstraites et qu'une classe abstraite ne contient pas de constructeur. qui a raison ?



    merci pour votre aide

    [ Modéré par Bulbo ]
    Ajout d'un tag dans le titre
    Les Règles du Forum

  2. #2
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    1- le this.nom_attribut est absolument intutile car quand tu as un attribut de classe nom_attribut référence la valeur de nom_attribut de la classe courante... Quoi qu'il es soit il est toujours conseillé d'utiliser un getNom_attribut() car ça permet de filtrer si besoin est l'accès à cet attribut.

    2- Supposons que tu ai une classe mère avec nom_méthode() et une classe fille avec un rédéfinition de nom_méthode(), dans la classe fille quand tu utilises:

    - nom_methode() ça référence nom_méthode() de la classe fille
    - this.nom_methode() ça référence nom_méthode() de la classe fille
    - super.nom_methode() ça référence nom_méthode() de la parente.

    Dans la classe mère quand tu utilises:

    - nom_methode() ça référence nom_méthode() de la classe mère
    - this.nom_methode() ça référence nom_méthode() de la classe mère. Et tu n'as pas accès à la redéfinition de cette méthode...

    3- Le constructeur vide existe par défaut (il fait rien). Donc tu peux le redefinir et dans ce cas tu as deux solutions pour initialiser tes attributs de class:

    - lors de leur définition private int attribut1 = 0;
    - lors de l'appel du constructeur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public constructeur() { 
      attribut1=0; 
    }
    Une classe abstraite contient une méthode abstraite au moins et elle contient un constructeur. Enn effet une classe abstraite peut posséder des attributs d'instance que tu souhaite initialiser.

    Une classe sans méthode abstraite n'as aucunement besoin d'être déclarée abstraite...

  3. #3
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut
    Alors dans l'ordre:

    1) Si tu as un accesseur (get...()) pour un attribut c'est toujours mieux de l'utiliser .. si tu n'en as pas le this.nom_attribut n'est pas vraiment utile.

    Pour eviter des problemes necessitant l'usage de this.nom_attribut pour clairement identifier un attribut, le mieux est de se fixer des regles d'ecritures..
    Par exemple un attribut private sera toujours precede de _, ainsi on sait tout de suite que _nom_attribut est private.
    Un parametre sera precede de un ou une ou des suivant le cas
    Ainsi au lieu d'ecrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public void setAtrtribut(Object attribut)
    {
      this.attribut = attribut;
    }
    On ecrira:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public void setAttribut(Object unAttribut)
    {
      _attribut = unAttribut;
    }
    C'est bcp moins risque et une bonne habitude a prendre..

    2) Le mieux c'est de faire nom_methode, si ta fille redefinie la methode pourquoi la methode toString voudrait utiliser la precedente declaration..

    Il faut faire confiance a son design objet sinon ou va-t-on ..

    3) Toutes les classes n'ont pas besoin d'un constructeur vide!! C'est quoi de cette regle ?
    Si il n'y a pas de constructeur de defini dans la classe, un construteur vide (sans parametre) existe par defaut.
    Si un constructeur avec parametre existe et que l'on a besoin d'un constructeur vide alors il faut le definir..

    4) Aucun des deux, une classe abstraite peut contenir des constructeurs et peut ne pas contenir de methodes abstraites..

    Voila en esperant avoir repondu a toutes tes interrogations.

    Bulbo

  4. #4
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Aucun des deux, une classe abstraite peut contenir des constructeurs et peut ne pas contenir de methodes abstraites..
    Je ne suis absolument pas d'accord, une classe abstraite sans méthode abstraite est complétement inutile !!!

  5. #5
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut
    Citation Envoyé par thibaut
    Une classe abstraite contient une méthode abstraite au moins et elle contient un constructeur. Enn effet une classe abstraite peut posséder des attributs d'instance que tu souhaite initialiser.

    Une classe sans méthode abstraite n'as aucunement besoin d'être déclarée abstraite...
    Tu peux avoir une classe abstraite sans methode abstraite mais que tu declares abstraite pour eviter une utilisation de cette classe sans specialisation.

    La definition d'un constructeur n'est pas obligatoire (le constructeur par defaut existera dans ce cas), certaine classe sont completement abstraite et un constructeur n'aurait donc pas de sens.

    Enfin je dis ca c'est juste pour chipoter

    Bulbo

  6. #6
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut
    deja merci a tous les 2 pr vos réponses.
    en ce ki concerne les classes abstraites, je me disais aussi que si elle n'a pas de methodes abstraites, je ne vois pas l'interet de declarer la classe abstraite.

    bon j'ai encore une precision a vous demander concernant ma question 2). en fait, la classe fille ne redefinit pas la methode surface(). elle utilise celle de la classe mere. dc est ce que je peux mettre , ds la classe fille,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public String toString(){
    return("la surface est"+super.surface());
    //ou bien ....this.surface()
    //ou bien ...surface()

    merci

  7. #7
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut
    Citation Envoyé par thibaut
    Aucun des deux, une classe abstraite peut contenir des constructeurs et peut ne pas contenir de methodes abstraites..
    Je ne suis absolument pas d'accord, une classe abstraite sans méthode abstraite est complétement inutile !!!
    Pas vraiment, si ta classe abstraite traite une collection par exemple mais que le type exact de collection n'est pas defini (a faire dans un constructeur), alors tu as une classe qui contient toute les methodes necessaires mais pas le constructeur permettant d'affecter un objet de type Collection.

    Seule une specialisation de cette classe peut etre construite bien qu'aucune de ses methodes ne soient abstraites.. c'est pas courant mais c'est possible ...

    Bulbo

  8. #8
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Les deux...

    Si tu ne redéfinis pas la méthode surface et que sa visibilité n'est pas privée, elle sera aussi visible dans la classe fille:

    donc tu pourras utiliser indiférrement les deux, mais il est déconseillé d'utiliser le this dans ce cas là.

    Le this est à utiliser dans 3 cas précis:

    - si une variable d'instance à un même nom qu'une variable locale d'une méthode comme dans les setter,
    - pour référencer l'instance courante de la classe est la passer à une méthode d'une autre classe par exemple,
    - pour référencer un des constructeurs de la classe courante.

    Une bonne habitude est de ne pas utiliser le this à tort et à travers...

    A+

  9. #9
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut
    Citation Envoyé par debdev
    bon j'ai encore une precision a vous demander concernant ma question 2). en fait, la classe fille ne redefinit pas la methode surface(). elle utilise celle de la classe mere. dc est ce que je peux mettre , ds la classe fille,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public String toString(){
    return("la surface est"+super.surface());
    //ou bien ....this.surface()
    //ou bien ...surface()
    tu n'as pas besoin de faire super.surface(), surface() appelera par defaut le surface defini dans la classe mere, sans compter que si un jour tu decides de redefinir surface dans la classe fille alors tu n'auras pas besoin de redefinir de nouveau ton toString.

    C'est ce que je te disais en te disant qu'il faut faire confiance a son design.. les methodes visibles dans la classe fille doivent etre celle utilisable par la classe fille et l'ecriture super.maMethode() doit utilisee avec parcimonie.
    1 - c'est risque car une modif de cette methode dans la classe mere impact directement la classe fille meme si elle redefinit elle meme la methode
    2 - bien souvent il s'agit d'un probleme de design et le code pourrait etre mieux organise ..

    Bulbo

  10. #10
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut
    ok merci beaucoup a tous les 2.
    c tres gentil d'avoir repondu aussi vite

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

Discussions similaires

  1. [Débutant] Classe abstraite ou Interface
    Par weabow dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 11/05/2014, 08h05
  2. [Débutant] classe abstraite ou interface
    Par Chatbour dans le forum Langage
    Réponses: 9
    Dernier message: 29/11/2007, 09h45
  3. Réponses: 6
    Dernier message: 20/03/2007, 10h51
  4. [Débutant]Passer une classe abstraite en paramètre
    Par Invité dans le forum Débuter
    Réponses: 2
    Dernier message: 06/01/2006, 17h56
  5. pb constructeurs classes dérivant classe abstraite
    Par Cornell dans le forum Langage
    Réponses: 2
    Dernier message: 10/02/2003, 19h02

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