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 :

[C#] Surcharge de constructeur


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Février 2004
    Messages
    206
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 206
    Par défaut [C#] Surcharge de constructeur
    Bonjour,

    je viens ici pour demander de l'aide à propos de la surcharge de constructeur.
    Je suis sur un site qui me semble un bon cours pour ma compréhension du C# POO. Je me suis donc inspiré d'un exemple existant pour illustrer quelque chose que je n'arrive pas à comprendre. Dans l'exemple ci-dessous j'instancie l'objet Chien de 2 façons Chien chien1 = new Chien() et Chien chien2 = new Chien("chien1"). Dans le premier j'obtiens les résultats que je souhaite donc car pour moi un chien1 est construit d'abord en tant qu'Animal sans argument puis en tant que Chien sans argument. PAr contre je ne comprends pas pourquoi pour l'objet chien2 j'ai le résultat un animal vient d'être créé sans argument et un nouveau chien vient d'être créé avec la variable chien2. Je m'attendais à voir d'abord : Un animal chien2 vient d'être créé !!! puis un nouveau chien vient d'être créé avec la variable chien2.
    J'espère avoir été clair dans la façon d'expliquer mon problème. Merci.
    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
     
    using System;
     
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                Chien chien1 = new Chien();
                Chien chien2 = new Chien("chien2");
            }
        }
     
        class Animal
        {
            public string v1;
     
            /**
             * constructeur de notre classe animal
             */
            public Animal()
            {
                Console.Out.WriteLine("Un animal vient d'être créé sans argument");
            }
     
            public Animal(string nomVariable)
            {
                Console.Out.WriteLine("Un animal" + nomVariable + " vient d'être créé !!!");
                this.v1 = nomVariable;
            }
          }
     
     
        class Chien : Animal
        {        
            public Chien()
            {
                Console.Out.WriteLine("un nouveau chien sans argument vient d'être créé");
            }
     
            public Chien(string nomVariable)
            {
                Console.Out.WriteLine("un nouveau chien vient d'être créé avec la variable " + nomVariable);
            }
     
        }
    }

  2. #2
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Lorsque tu instancies un objet dérivé il y a toujours un appel à un des constructeurs de la classe parent.

    Cet appel est soit implicite, le constructeur par défaut de la classe parent est alors utilisé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public Chien()
    {
        ...
    }
    Revient à écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public Chien() : base()
    {
        ...
    }
    Le mot clé base permettant d'indiquer le constructeur de la classe parent à utiliser pour l'instanciation.

    Soit explicite, dans ce cas on indique le constructeur de la classe parent à utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public Chien(string nomVariable) : base(nomVariable)
    {
        ...
    }

  3. #3
    Membre confirmé
    Inscrit en
    Février 2004
    Messages
    206
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 206
    Par défaut
    merci Je ne connaissais pas ce mot clé et son utilisation. Miantenant mon programme exemple fonctionne correctement.

    Merci pour tes explications.

  4. #4
    Membre émérite
    Inscrit en
    Octobre 2006
    Messages
    587
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Octobre 2006
    Messages : 587
    Par défaut
    Tu peux appeler le constructeur de la classe mère mais tu peux aussi appeler les constructeurs surchargés ou non de ta classe avec le mot clé this

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //Ce constructeur appellera explicitement  le constructeur Chien() de la même classe avec d'exécuter ses instructions.
    public Chien(string chaine) : this()
    {
     
    }

  5. #5
    Membre confirmé
    Inscrit en
    Février 2004
    Messages
    206
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 206
    Par défaut
    Merci Harz,

    c'est un aspect que je n'ai pas trouvé dans le cours que j'utilise.
    A+

  6. #6
    Membre averti
    Inscrit en
    Mars 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 29
    Par défaut
    Je relance le sujet par une nouvelle question : peux t on avoir les deux en même temps (this & base) dans la surcharge d'un constructeur ?

    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 A
    {
       A()
       A(int i):this()
       A(int i, int j):this(i)
    }
     
    public class B : A
    {
       B()
       B(int k):this() & base()
       B(int k, int l):this(k) & base(k)
    }

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

Discussions similaires

  1. Surcharger un constructeur de classe
    Par pdgnr dans le forum C++Builder
    Réponses: 5
    Dernier message: 09/11/2006, 10h17
  2. [POO] Surcharge de constructeur
    Par loganblack dans le forum Langage
    Réponses: 4
    Dernier message: 17/05/2006, 12h26
  3. Réponses: 19
    Dernier message: 19/04/2006, 10h16
  4. [POO] surcharger le constructeur
    Par wdionysos dans le forum Langage
    Réponses: 9
    Dernier message: 22/03/2006, 15h42
  5. Surcharge de constructeur???
    Par Sunsawe dans le forum Général Python
    Réponses: 3
    Dernier message: 14/03/2006, 17h26

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