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

C# Discussion :

les éléments d'une classe


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de ralf91
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 419
    Par défaut les éléments d'une classe
    Salut,

    j'ai quelques questions a vous poser sur l'utilisation des classe et de ses éléments.
    Soit la classe personne :
    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
     
    namespace ConsoleApplication1
    {
        class Personne
        {
     
            private String nom;
     
            public String Nom
            {
                set { nom = value; }
                get { return nom; }
            }
     
     
            private String prenom;
     
            public string Prenom
            {
                set { pernom = value; }
                get { return prenom; }
            }
     
            public Personne(String nom) {
                Nom = nom;
            }
     
            public Personne(): this("") { 
     
            }
        }
    }
    je souhaiterais comprendre ligne par ligne ce code

    voici mes questions :
    - qu'est ce qu'une propriété ? pourquoi on les utilise ? si c'est pour reconnaitre l'attribut dans une autre classe, pourquoi on utilise pas directement le mot clé public au lieu de private a la déclaration de l'attribut ?

    - c'est quoi SET et GET ? a quoi ils servent ?

    - pourquoi on appelle avec le nom de la classe a l'intérieur de la même classe ? pourquoi on utilise des constructeurs a l'intérieur des classes ? c'est quoi la différence avec le constructeur que l'on crée avec le mot clé NEW ?

    - est ce qu'on doit initialiser les attributs ? comment faire pour les initialiser ?

    Merci d'avance pour vos réponses.

  2. #2
    Rédacteur

    Avatar de Jean-Michel Ormes
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    1 838
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 838
    Par défaut
    Citation Envoyé par ralf91 Voir le message
    Salut,

    j'ai quelques questions a vous poser sur l'utilisation des classe et de ses éléments.
    Soit la classe personne :
    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
     
    namespace ConsoleApplication1
    {
        class Personne
        {
     
            private String nom;
     
            public String Nom
            {
                set { nom = value; }
                get { return nom; }
            }
     
     
            private String prenom;
     
            public string Prenom
            {
                set { pernom = value; }
                get { return prenom; }
            }
     
            public Personne(String nom) {
                Nom = nom;
            }
     
            public Personne(): this("") { 
     
            }
        }
    }
    je souhaiterais comprendre ligne par ligne ce code

    voici mes questions :
    - qu'est ce qu'une propriété ? pourquoi on les utilise ? si c'est pour reconnaitre l'attribut dans une autre classe, pourquoi on utilise pas directement le mot clé public au lieu de private a la déclaration de l'attribut ?
    Salut,

    Une propriété est une valeur qui peut être lue ou modifiée, comme une variable. Des propriétés peuvent très bien être déclarés en public. Cela dépend de l'utilisation que l'on souhaite en faire.

    Citation Envoyé par ralf91 Voir le message
    - c'est quoi SET et GET ? a quoi ils servent ?
    Ce sont des accesseurs

    SET pour setters, en gros c'est une méthode qui permet d'attribuer une valeur.
    GET pour getters, permet de récupérer une valeur.

    Citation Envoyé par ralf91 Voir le message
    pourquoi on utilise des constructeurs a l'intérieur des classes ? c'est quoi la différence avec le constructeur que l'on crée avec le mot clé NEW ?
    Les constructeurs permettent d'initialiser les données membres de ton objet (si tu n'utilises pas un constructeur par défaut). Le mot-clé new permet de créer une instance d'un objet. si tu ne passes pas d'arguments, ce sera le constructeur par défaut qui sera appelé.

    Citation Envoyé par ralf91 Voir le message
    - est ce qu'on doit initialiser les attributs ? comment faire pour les initialiser ?

    Merci d'avance pour vos réponses.
    Tu n'es pas obligé de les initialisés, mais si tu souhaites le faire, tu utilises les setters

  3. #3
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Salut


    Un new te permet d'instancier une classe
    Losque tu instancie une classe tu appelle son constructeur
    Une classe a toujours un constructeur par defaut meme si tu ne le déclare pas
    Le constructeur par défaut ne fait rien d'autre que créer la classe et les prooriétés et methode qu'elle contient

    Un constructeur explicite te permet d'effectuer des operation lors de l'intanciation de ta classe, par exemple effectuer un query dans une DB et assigner des valeurs aux propriétés de ta classe avec lec resultat de ce query

    Un accesseur te permet de controler les acces a une propriété
    Un accesseur peut contenir une methode qui rendra la valeur attendue (get)
    Ou qui effectuera des controle ou opérations lors de l'assignation (set)

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par ralf91 Voir le message
    - qu'est ce qu'une propriété ? pourquoi on les utilise ? si c'est pour reconnaitre l'attribut dans une autre classe, pourquoi on utilise pas directement le mot clé public au lieu de private a la déclaration de l'attribut ?
    Une propriété est en fait une facilité syntaxique pour créer des accesseurs pour un membre de classe. Dans d'autres langages (Java par exemple), les accesseurs get/set sont implémentés sous forme de méthodes (getToto/setToto), et c'est d'ailleurs ce qui se passe en interne en C#. En gros, plutôt que de donner directement l'accès public à un champ de la classe (ce qui est déconseillé), on passe par une méthode (les accesseurs get/set) qui permet de contrôler comment on accède à ce champ et éventuellement d'effectuer des opérations en plus (par exemple déclencher un évènement quand une propriété est modifiée)


    Citation Envoyé par ralf91 Voir le message
    - c'est quoi SET et GET ? a quoi ils servent ?
    Ce sont les accesseurs qui permettent de modifier la valeur d'une propriété. En fait c'est comme des méthodes, tu peux mettre ce que tu veux dedans (mais évite d'y mettre des traitements lourds)

    Citation Envoyé par ralf91 Voir le message
    - pourquoi on appelle avec le nom de la classe a l'intérieur de la même classe ?
    Parce que c'est comme ça que le langage définit la syntaxe d'un constructeur...

    Citation Envoyé par ralf91 Voir le message
    pourquoi on utilise des constructeurs a l'intérieur des classes ? c'est quoi la différence avec le constructeur que l'on crée avec le mot clé NEW ?
    Tu confonds 2 choses : la définition (déclaration et implémentation) d'un constructeur, et son utilisation. Le mot clé new permet de créer une instance d'une classe en appelant un constructeur de cette classe. Une classe peut définir plusieurs constructeurs, qui sont déclarés avec la syntaxe mentionnée plus haut.

    Pour info, la syntaxe ": this(...)" permet d'appeler un autre constructeur de la même classe, de la même façon que ": base(...)" permet d'appeler un constructeur de la classe de base.


    Citation Envoyé par ralf91 Voir le message
    - est ce qu'on doit initialiser les attributs ? comment faire pour les initialiser ?
    Non, ce n'est pas obligatoire. Si tu ne les initialises pas, il auront leur valeur par défaut, c'est à dire null pour un type référence, et tous les octets à 0 pour un type valeur. Si tu veux les initialiser à une valeur spécifique, tu peux le faire directement à la déclaration, ou dans un constructeur

  5. #5
    Membre éclairé Avatar de ralf91
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 419
    Par défaut
    Merci beaucoup pour vos réponses,
    Ben j'avoue que je me sens beaucoup mieux qu'avant, juste quelques détails que je souhaiterais encore savoir

    - Le deuxième constructeur sert à quoi exactement puisque l'initialisation se fait dans le premier ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public Personne(): this("") { }
    plutôt que de donner directement l'accès public à un champ de la classe (ce qui est déconseillé)
    Pourquoi c'est déconseillé ?

    Si j'ai bien compris, les propriétés se sont des attributs mais plus sécurisés ! (on peut y ajouter des contrôles au niveau des setters).
    Les constructeurs permettent de donner une valeur initiale aux attributs c'est tout.

    Merci encore.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par ralf91 Voir le message
    - Le deuxième constructeur sert à quoi exactement puisque l'initialisation se fait dans le premier ?
    Ca permet d'initialiser l'objet de 2 façons différentes, en spécifiant le paramètre ou non. Si tu utilises la forme sans paramètre, c'est comme si tu avais passé une chaine vide en paramètre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Person p = new Person(); // équivalent à new Person("");
    Citation Envoyé par ralf91 Voir le message
    Pourquoi c'est déconseillé ?
    Parce que ça veut dire que n'importe qui peut modifier l'état interne de ta classe, sans que tu puisses le savoir ou l'empêcher. Ca brise l'encapsulation. Dans certains cas, ce n'est pas gênant, c'est pour ça que très souvent les propriétés ne font rien d'autre que d'accéder au champ. Mais si un jour tu veux ajouter de la logique dans le set (contrôler la valeur, déclencher un évènement, etc), il faudra forcément que ce soit une propriété. Et si c'est une DLL utilisée par d'autre programme, tu ne peux pas juste transformer le champ en propriété car les autres programmes ne sauraient plus l'utiliser (à moins d'être recompilés). Donc en général on n'expose jamais de champs publics, on utilise toujours des propriétés. Ca permet de modifier facilement l'implémentation interne plus tard, sans changer l'interface publique.

    Citation Envoyé par ralf91 Voir le message
    Si j'ai bien compris, les propriétés se sont des attributs mais plus sécurisés ! (on peut y ajouter des contrôles au niveau des setters).
    Tu peux aussi personnaliser le code du getter, ça se fait souvent, par exemple, pour faire des initialisations tardives (lazy initialization) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    private List<string> _items;
     
    public IList<string> Items
    {
        get
        {
            if (_items == null)
            {
                _items = LoadItemsFromDatabase();
            }
            return _items;
        }
    }

    Au passage, tu remarqueras que la propriété ne renvoie pas une List<T> mais une IList<T> : de cette façon, si je veux un jour remplacer ma List<T> utilisée en interne par une autre implémentation de l'interface IList<T>, le code qui utilise cette propriété ne sera pas impacté

    Citation Envoyé par ralf91 Voir le message
    Les constructeurs permettent de donner une valeur initiale aux attributs c'est tout.
    pas seulement, tu peux faire toutes sortes d'opérations nécessaires à l'initialisation de ta classe

  7. #7
    Membre confirmé Avatar de dsolheid
    Inscrit en
    Décembre 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Décembre 2007
    Messages : 141
    Par défaut
    Citation Envoyé par ralf91 Voir le message
    Merci beaucoup pour vos réponses,
    Ben j'avoue que je me sens beaucoup mieux qu'avant, juste quelques détails que je souhaiterais encore savoir

    - Le deuxième constructeur sert à quoi exactement puisque l'initialisation se fait dans le premier ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public Personne(): this("") { }

    Pourquoi c'est déconseillé ?

    Si j'ai bien compris, les propriétés se sont des attributs mais plus sécurisés ! (on peut y ajouter des contrôles au niveau des setters).
    Les constructeurs permettent de donner une valeur initiale aux attributs c'est tout.

    Merci encore.
    Il y a des beaux petits tutos de POO (Programmation Orienté Objet) sur le net ...

    C'est tj intéressant de savoir à quoi servent les mots clés utilisés pour définir la visibilité des classes, méthodes et variables membres ... (çad PUBLIC/PROTECTED/PRIVATE, ..)
    La notion d'héritage, polymorphisme, interface, classe abstraite, ...,etc ...

    Welcom

Discussions similaires

  1. [JavaScript] Changer le style de tous les éléments d'une même classe en javascript
    Par dragonno dans le forum Contribuez
    Réponses: 1
    Dernier message: 12/10/2018, 19h09
  2. Réponses: 9
    Dernier message: 17/11/2014, 19h10
  3. Un tableau associatif avec les éléments d'une classe
    Par renaud26 dans le forum jQuery
    Réponses: 2
    Dernier message: 29/11/2011, 06h07
  4. Parcourir les éléments d'une classe
    Par M.Dolly dans le forum Général Python
    Réponses: 9
    Dernier message: 30/08/2009, 15h41
  5. Parcourir les éléments d'une classe
    Par rvhp2 dans le forum Langage
    Réponses: 10
    Dernier message: 01/10/2008, 19h06

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