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

avec Java Discussion :

[Débutant] Class - Je ne comprends plus rien !


Sujet :

avec Java

  1. #1
    Membre régulier Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Points : 123
    Points
    123
    Par défaut [Débutant] Class - Je ne comprends plus rien !
    Bonjour,

    Je cherche désespérément à comprendre les getter et setter d'une classe. Jusque là, j'ai compris que dans le premier cas on récupère les informations alors que dans l'autre on écrit les informations.

    Me basant sur ce constat, j'ai essayer de me faire un exemple afin de tester la validité de mes dires. Et la miracle, c'est deux erreurs que je ne comprends pas!

    Tout d'abord voici ma classe de test:
    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
     
    package AppliClasses;
     
    public class Chanson {
     
        /*
         * Les méthodes de la classe chanson
         */
        public void setChanson(String titleChanson) {
            this.nomChanson = titleChanson;
        }
     
        public void getChanson() {
            //System.out.println(nomChanson);
     
            return nomChanson;
        }
     
        /*
         * Les champs de la classe chansson
         */
        private String nomChanson;
    }
    Lorsque je place mon return nomChanson, je cherche à retourné le nom via le getter, vue qu'il est censé le renvoyer. A moins que je ne me trompe !
    L'erreur que me retourne netBeans est la suivante .
    cannot return a value from methode whose result type is void
    En gros, si j'ai bien compris, on ne peux pas retourné de valeur car la méthode est de type void.

    Pourquoi ? Et comment alors je devrais faire mon getter pour qu'il me retourne la valeur?

    Ensuite, passons du cotés du main. ou j'ai un autre type d'erreur et je ne sait pas si c'est le complément de la première. Je suppose que oui.

    Si j'écris le main suivant:
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
     
    package Appli;
    import AppliClasses.Chanson;
     
    public class MainForm extends javax.swing.JFrame {
     
        /** Creates new form MainForm */
        public MainForm() {
            initComponents();
        }
     
        /** This method is called from within the constructor to
         * initialize the form.
         * WARNING: Do NOT modify this code. The content of this method is
         * always regenerated by the Form Editor.
         */
        @SuppressWarnings("unchecked")
        // <editor-fold defaultstate="collapsed" desc="Generated Code">
        private void initComponents() {
     
            jScrollPane1 = new javax.swing.JScrollPane();
            jTextAreaOut = new javax.swing.JTextArea();
            jBtnTester = new javax.swing.JButton();
     
            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
     
            jTextAreaOut.setColumns(20);
            jTextAreaOut.setRows(5);
            jScrollPane1.setViewportView(jTextAreaOut);
     
            jBtnTester.setText("Tester");
            jBtnTester.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    jBtnTesterActionPerformed(evt);
                }
            });
     
            javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
            getContentPane().setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addContainerGap()
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 376, Short.MAX_VALUE)
                        .addComponent(jBtnTester))
                    .addContainerGap())
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                    .addContainerGap()
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 243, Short.MAX_VALUE)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addComponent(jBtnTester)
                    .addContainerGap())
            );
     
            pack();
        }// </editor-fold>
     
        private void jBtnTesterActionPerformed(java.awt.event.ActionEvent evt) {
     
            Chanson ch = new Chanson();
            ch.setChanson("Butterfly");
     
            //ch.getChanson();
            jTextAreaOut.setText(ch.getChanson());
        }
     
     
        /**
        * @param args the command line arguments
        */
        public static void main(String args[]) {
            java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                    new MainForm().setVisible(true);
                }
            });
        }
     
        // Variables declaration - do not modify
        private javax.swing.JButton jBtnTester;
        private javax.swing.JScrollPane jScrollPane1;
        private javax.swing.JTextArea jTextAreaOut;
        // End of variables declaration
     
    }
    J'obtiens le message d'erreur suivant:
    'void' type not allowed here.
    Donc en gros je n'ai pas alloué de type void à mon affichage.

    Je précise que ce n'est pour moi qu'un exercice visant à comprendre comment fonctionne une classe. Il se peut que j'ai commis d'énormes erreurs, mais ce n'est pas simple avec le nombre de messages ne disant pas la même chose.

    Je sollicite donc votre aide pour éclairer ma lanterne et y voire plus clair en ce qui concerne les classes.

    Merci beaucoup pour votre aide.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 136
    Points : 100
    Points
    100
    Par défaut
    Là ta méthode get retourne void (vide ou rien). Pour retourner un type donné, il faut le déclarer dans la signature de ta méthode.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public String getChanson() {
            //System.out.println(nomChanson);
     
            return nomChanson;
        }

  3. #3
    Membre régulier Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Points : 123
    Points
    123
    Par défaut
    Ok pour l'histoire du void.

    Mais cela ne me dit en rien pourquoi la fonction ne prendrais pas directement le champ nomChanson dans le getter alors que nomChanson est cencé se remplir avec le setter. A moins que je ne me trompe. Ce qui se peut aussi.

  4. #4
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 239
    Points : 313
    Points
    313
    Par défaut
    Bonjour.

    Citation Envoyé par Microbulle Voir le message
    Mais cela ne me dit en rien pourquoi la fonction ne prendrais pas directement le champ nomChanson dans le getter alors que nomChanson est cencé se remplir avec le setter. A moins que je ne me trompe. Ce qui se peut aussi.
    De quelle fonction parlez vous ?

    L'intérêt de la classe est de créer un type.
    Ce type va contenir des attributs (ici, il n'y a qu'un seul attribut : nomChanson). En règle général, ces attributs sont "privés", ce qui signifie que seule des méthodes de la classe vont pouvoir y accéder.
    Si l'on veut que d'autres classes y accèdent, il faut créer ce que l'on appelle des getters et setters pour chaque attribut.
    Les getters/setters sont des méthodes de la classe retournant (get) ou affectant (set) un attribut privé. L'intérêt est que l'attribut ne peut pas être directement modifié dans une autre classe (cela évite les choses du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Chanson ch = new Chanson();
    ch.nomChanson = "blabla";
    On est ainsi obligé de passer par les méthodes des classes pour y accéder en lecture comme en écriture.

    Ainsi, lorsque vous faîtes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Chanson ch = new Chanson();
    Vous créez un nouvel objet de la classe Chanson.
    Cet objet possède alors l'état suivant :
    ch
    nomChanson == null
    Ensuite, vous affectez le nomChanson en utilisant le setter (donc vous modifiez votre objet ch de classe Chanson) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ch.setChanson("Butterfly");
    Votre objet possède alors l'état suivant :
    ch
    nomChanson == "Butterfly"

    Enfin, vous accédez à l'attribut nomChanson via son getter (vous ne modifiez pas l'objet) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jTextAreaOut.setText(ch.getChanson());

  5. #5
    Membre régulier Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Points : 123
    Points
    123
    Par défaut
    Je suis bien d'accord avec ce qui est dit plus haut.
    Mais si on se doit d'éviter ce que j'ai écrit, comme dit au précédent post. Il faut faire comment pour que ça fonctionne ?

    Je vais faire un édit.
    Je me suis baladé sur les tutoriaux, quand d'un coup je me suis rendu compte que des getters était écris comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public String getName() {
        return cached;
    }
    Si je regarde bien mon code, j'avais mis void à la place de String. C'est pour ça que dans mon main, j'avais une erreur du à void.

    Je n'avais pas saisie que l'on pouvais forcé un getter à un type comme String. Du coup, j'ai écrit ma classe ainsi:
    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
     
    package AppliClasses;
     
    public class Chanson {
     
        /*
         * Les méthodes de la classe chanson
         */
        public void setChanson(String titleChanson) {
            this.nomChanson = titleChanson;
        }
     
        public String getChanson() {
            //System.out.println(nomChanson);
     
            return nomChanson;
        }
     
        /*
         * Les champs de la classe chansson
         */
        private String nomChanson;
    }
    Maintenant j'aimerais en savoir un peux plus en ce qui concerne les possibilités d'étendre la classe depuis une autre classe. C'est à dire déjà savoir si c'est possible et y ajouter un attribue durée par exemple.

  6. #6
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 239
    Points : 313
    Points
    313
    Par défaut
    En fait, le getter retourne un attribut.
    L'attribut nomChanson est du type String, donc le getter de nomChanson ne peut que retourner un type String.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Maintenant j'aimerais en savoir un peux plus en ce qui concerne les possibilités d'étendre la classe depuis une autre classe. C'est à dire déjà savoir si c'est possible et y ajouter un attribue durée par exemple.
    Ce dont vous parlez doit s'agir d'héritage ?
    C'est à dire créer une nouvelle classe identique à la classe Chanson, cependant cette classe aurait en plus un attribut duree, est-ce bien cela ?

    Si c'est ce que vous souhaitez, je vous conseille de lire le didacticiel conseillé dans un sujet plus haut du forum :
    http://java.developpez.com/livres/javaEnfants/ et en particulier le paragraphe suivant : http://java.developpez.com/livres/ja...e=classes#LV-D

  7. #7
    Membre régulier Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Points : 123
    Points
    123
    Par défaut
    Avec les indications suivantes, j'ai réaliser ceci:

    Classe parente :
    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
     
    package AppliClasses;
    public class Chanson {
     
        /*
         * Les méthodes de la classe chanson
         */
     
        public void setChanson(String titleChanson) {
            this.nomChanson = titleChanson;
        }
     
        public String getChanson() {
            return nomChanson;
        }
     
        /*
         * Les champs de la classe chansson
         */
        private String nomChanson;
    }
    La classe enfant:
    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
     
    package AppliClasses;
    public class ChansonPlus extends Chanson {
        /*
         * Les méthodes de la classe chanson
         */
     
        public void setDuree(int Duree) {
            this.dureeChanson = Duree;
        }
     
        public void setTimeExtension(String Extension) {
            this.extensionTemps = Extension;
        }
     
        public String getDuree() {
            String LaDuree = dureeChanson + " " + extensionTemps;
            return LaDuree;
        }
     
        /*
         * Les champs de la classe chansson
         */
        private int dureeChanson;
        private String extensionTemps;
    }
    et enfin le main modifier:
    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
     
    package Appli;
    import AppliClasses.Chanson;
    import AppliClasses.ChansonPlus;
     
    public class MainForm extends javax.swing.JFrame {
     
        /** Creates new form MainForm */
        public MainForm() {
            initComponents();
        }
     
        @SuppressWarnings("unchecked")
     
        private void jBtnTesterActionPerformed(java.awt.event.ActionEvent evt) {                                           
     
            ChansonPlus ch = new ChansonPlus();
            ch.setChanson("Butterfly");
     
            ch.setDuree(10);
            ch.setTimeExtension("min");
     
     
            jTextAreaOut.setText("Le titre de la chanson est : " + ch.getChanson() + " Durée : " + ch.getDuree());
        }       
     
        public static void main(String args[]) {
            java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                    new MainForm().setVisible(true);
                }
            });
        }
     
        // Variables declaration - do not modify                     
        private javax.swing.JButton jBtnTester;
        private javax.swing.JScrollPane jScrollPane1;
        private javax.swing.JTextArea jTextAreaOut;
        // End of variables declaration                   
     
    }
    Si je comprends bien, lorsque on utilise une classe hérité, pour accéder aux setter et getter de la classe parente, on doit indiqué la classe enfant, mais si on s'en tiens aux setter et getter uniquement, on peut laisser le constructeur sur la classe parente.

    J'espère que je ne dis pas là trop de bêtises de débutant. Rectifiez-moi si je met des erreurs.

  8. #8
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 239
    Points : 313
    Points
    313
    Par défaut
    Si je comprends bien, lorsque on utilise une classe hérité, pour accéder aux setter et getter de la classe parente, on doit indiqué la classe enfant
    En fait, les méthodes de la classe parente sont ici "publiques" (via le mot clé public), c'est à dire qu'elles peuvent être appelées de n'importe quelle classe.
    Si je crée un objet de la classe Chanson, je vais pouvoir appeler toutes ses méthodes publiques, à savoir setChanson et getChanson. Par contre, je ne vais pas pouvoir accéder directement à son champ nomChanson, car celui-ci est privé (mot clé private), ce qui signifie que l'on restreint son accès à la classe courante. On ne va pas pouvoir non plus accéder à cet attribut dans les classes filles.
    En clair, dans la classe ChansonPlus, on ne peut pas, dans une nouvelle méthode, faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.nomChanson = "blabla";
    Si vous voulez accéder à ce champ dans la classe fille ChansonPlus, il faut le mettre en "protégé" (mot clé protected) et non en privé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        /*
         * Les champs de la classe chansson
         */
        protected String nomChanson;
    , mais si on s'en tiens aux setter et getter uniquement, on peut laisser le constructeur sur la classe parente.
    Si vous appelez le constructeur d'une classe, vous créez un objet de cette classe.
    La classe Chanson n'est pas la classe ChansonPlus, et la classe ChansonPlus n'est pas la classe Chanson.
    Si vous créez un objet de la classe Chanson :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Chanson ch = new Chanson();
    Vous ne pouvez pas exécuter ceci :

  9. #9
    Membre régulier Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Points : 123
    Points
    123
    Par défaut
    Alors pourquoi dans le cas ou j'écris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ChansonPlus ch = new ChansonPlus();
            ch.setChanson("Butterfly");
     
            ch.setDuree(10);
            ch.setTimeExtension("min");
     
     
            jTextAreaOut.setText("Le titre de la chanson est : " + ch.getChanson() + " Durée : " + ch.getDuree());
    Ça fonctionne ?

    J'aurais certainement du avoir deux constructeurs avec deux appels différents. Ou j'ai oublier quelque-chose ?

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 299
    Points : 422
    Points
    422
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class ChansonPlus extends Chanson { ... ...
    ChansonPlus est une chanson, donc elle hérite des attributs et des méthodes de la class parente.
    Donc pas besoin d'avoir 2 constructeurs.

    Par contre l'inverse n'est pas vrai.

    Tu peux utiliser d'autres types d'objet plus parlant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class Animal  { ... ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class Oiseau extends Animal { ... ...
    Tous les animaux peuvent manger, donc tous les oiseaux (qui sont des animaux) peuvent aussi manger.
    Par contre les oiseaux peuvent voler, mais cela ne veut pas dire que tous les animaux le peuvent.

  11. #11
    Membre régulier Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Points : 123
    Points
    123
    Par défaut
    Je suis bien d'accord effectivement pour le principe. Mais ce que je n'arrive pas à comprendre en revanche c'est que si on à le schéma suivant:
    class Chanson ->[setChanson] [getChanson]
    class ChansonPlus extends Chanson -> [setDuree] [setTimeExtension] [getDuree]
    Si on ne veux que setChanson et GetChanson, on fait un constructeur du type Chanson ch = new Chanson;

    Si on veut l'intégralité des setters et getters il faudrais que je face un constructeur du type ChansonPlus ch = new Chanson; au lieu de Chanson ch = new Chanson;

    Pourquoi ?
    Je dis pourquoi car il me semble plus logique de pouvoir accéder aux paramètre de l'enfant depuis le parent plus que l'inverse. Mais je fait surement une mauvaise interprétation de la relation parent enfant (dans le domaine informatique)...

  12. #12
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 239
    Points : 313
    Points
    313
    Par défaut
    Pour imager :
    L'enfant a les mêmes caractéristiques que le parent, et peut avoir des caractéristiques en plus.

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 299
    Points : 422
    Points
    422
    Par défaut
    Le mot enfant est peut-être trompeur.
    C'est une class étendue => extends

    Pour reprendre mon exemple des animaux, quand on a un oiseau, on sait que c'est un animal, par contre quand on a un animal, on ne sait pas si c'est un oiseau.

    Donc pour toi, quand tu as une ChansonPlus, tu sais que c'est une chanson.
    Par contre quand tu fais une simple Chanson, tu ne sais pas si c'est une chansonplus et tu ne peux donc pas en appeler les méthodes.

  14. #14
    Membre régulier Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Points : 123
    Points
    123
    Par défaut
    Ok je comprends mieux.

    C'est vrai que de partir avec une classe abstraite n'est peut-être pas la meilleure chose à faire.

    Vous allez peut-être me dire que je suis pénible. Mais que fait-on du mot super ? A quoi sert-il ? Dans quel mesure il peur aider la programmation. Enfin tout ce qui touche autour du mot super au niveau des classes.

    En attendant, je vais refaire mon exemple pour un animal, il sera plus parlant.

  15. #15
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 239
    Points : 313
    Points
    313
    Par défaut
    Le mot super est à utiliser dans le cas où une méthode de la classe mère est redéfinie dans la classe fille, c'est à dire que l'on une méthode ayant le même nom dans la classe mère et dans la classe fille.

    Exemple de redéfinition de méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class Animal {
      ...
      public boolean peutVoler() {
        return false;
      }
      ...
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class Oiseau extends Animal {
      ...
      public boolean peutVoler() {
        return true;
      }
      ...
    }
    Exemple d'utilisation du mot super :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class Animal {
      private int nbPattes;
      public void setNbPattes(int nouveauNbPattes)  {
        this.nbPattes = nouveauNbPattes;
      }
      ...
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class Oiseau extends Animal {
      ...
      public void setNbPattes(int nouveauNbPattes)  {
        super.setNbPattes(nouveauNbPattes);
        //autres opérations
      }
      ...
    }
    Le mot clé super est souvent utilisé également dans les constructeurs.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class Animal {
      public Animal() {
      // Initialisation de l'objet
       ...
      }
      ...
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class Oiseau extends Animal {
      ...
      public Oiseau() {
      //Appel du constructeur de la classe mère : Animal()
      super();
      //Opérations d'initialisation propres à la classe Oiseau
      ...
      }
      ...
    }

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 299
    Points : 422
    Points
    422
    Par défaut
    Voilà, dans le dernier exemple de jcdentons, le fait de mettre super(); dans le constructeur de la class Oiseau, va déclancher le constructeur de la class Animal.

    Le constructeur va permettre d'initialiser l'animal générique. Ensuite dans la class oiseau, à la suite de super(), tu vas pouvoir initialiser les attirbuts spécifiques de la class oiseau.

  17. #17
    Membre régulier Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Points : 123
    Points
    123
    Par défaut
    J'essaie de comprendre et c'est pour cela que je ne vais émettre que des hypothèses.

    Si je comprend correctement ce qui a été mis comme exemple et comme explication, on commence par posé le constructeur de l'animal et avec le mot super on ira cherché les propriété de l'enfant c'est à dire oiseau, chat etc...

    Ce qui me fait pensé que ça risque aussi de partir dans tous les sens (et ça ce n'est pas bon du tout).

    Une autre possibilité est que nous déclarons toujours l'enfant ce qui permet d'accéder au parent mais depuis l'enfant avoir des propriété qui sont normalement protégé accédé par le mot super.

    Ca serais alors plus propre que précédemment et cela permettrait de poussé plus loin la classe enfante.

    Mais je n'ai que ces deux hypothèse, je suis peut-être dans le faux. A voir avec ma nouvelle classe que je n'ai pas eu le temps de re écrire complètement !

  18. #18
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 239
    Points : 313
    Points
    313
    Par défaut
    Si je comprend correctement ce qui a été mis comme exemple et comme explication, on commence par posé le constructeur de l'animal et avec le mot super on ira cherché les propriété de l'enfant c'est à dire oiseau, chat etc...
    Non, le mot clé super permet d'exécuter des méthodes ou d'accéder à des attributs public ou protected du PARENT et non de l'enfant.
    Ce mot clé est à utiliser dans la classe enfant pour accéder aux données du parent.

  19. #19
    Membre régulier Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Points : 123
    Points
    123
    Par défaut
    Ok !
    La je comprends parfaitement

    donc si j'écris ceci dans Animal.java:
    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
     
    package AppliClasses;
    public class Animal {
     
        /*
         * Les méthodes de la classe Animal
         */
     
        public void setAnimal(String Nom) {
            this.nomAnimal = Nom;
        }
     
        public String getAnimal() {
            return nomAnimal;
        }
     
        /*
         * Les champs de la classe Animal
         */
     
        private String nomAnimal;
     
    }
    Puis dans Chien.java
    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
     
    package AppliClasses;
    public class Chien extends Animal {
        /*
         * Les méthodes de la classe Chien
         */
     
        public void setRace(String Race) {
            this.nomRace = Race;
        }
     
        public void setPoils(String Poils) {
            this.typePoils = Poils;
        }
     
        public String getChien() {
            String Chien = super(nomAnimal) + nomRace + " à poils " + typePoils;
            return Chien;
        }
     
        /*
         * Les champs de la classe Chien
         */
     
        private String nomRace;
        private String typePoils;
    }
    Ça devrait fonctionné.

  20. #20
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 239
    Points : 313
    Points
    313
    Par défaut
    Presque.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private String nomAnimal;
    Le mot clé private interdit d'accéder au champ nomAnimal dans les autres classes.
    Par contre, vous pouvez accéder au getter, qui lui est déclaré en public :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public String getAnimal()
    Cette méthode n'étant pas redéfinie dans la classe Chien, le mot clé super n'est pas nécessaire.

    Vous pouvez donc essayer ceci dans la classe Chien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ...
    public String getChien() {
            String Chien = getAnimal() + nomRace + " à poils " + typePoils;
            return Chien;
        }
     
    ...
    Pour information, le mot clé super s'utilise de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    super.nomAttribut;
    super.nomMethodeSansArgument();
    super.nomMethodeAvecArguments(argument1, argument2, ... argumentn);

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. Action sur un bouton..Je comprends plus rien du tout!
    Par koolway dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 26/04/2006, 10h17
  2. Réponses: 4
    Dernier message: 20/04/2006, 14h25
  3. Réponses: 12
    Dernier message: 03/01/2006, 17h23
  4. Je n'y comprend plus rien
    Par Pingouinvert dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 11/09/2005, 10h57
  5. [Kylix] Je n'y comprends plus rien
    Par fafamonteko dans le forum EDI
    Réponses: 5
    Dernier message: 02/03/2004, 16h48

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