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 :

Surcharge de constructeurs


Sujet :

C#

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2012
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Surcharge de constructeurs
    Salut à tous,
    J'ai essayé de surcharger +eurs constructeurs dans cette classe :
    class Five
    {
    int member;
    public static int counter = 0;
    public Five() { System.Console.WriteLine("Instance Constructor is Called !"); }
    public Five(int m = -1) { member = m; }
    static Five() { System.Console.WriteLine("Static Constructor is Called !"); counter = 10; }
    public override string ToString()
    {
    return member.ToString();
    }
    }
    Et après dans le Main :
    class Begin
    {
    static void Main(string[] args)
    {
    System.Console.WriteLine("Counter value before calling static constructor: {0}",Five.counter);
    Five f1 = new Five();
    Five f2 = new Five(4);
    System.Console.WriteLine("Counter value after calling static constructor: {0}", Five.counter);
    System.Console.WriteLine("'Five' objects values : {0} , {1}", f1, f2);
    }
    }
    Je m'attendais à une erreur de compilation puisque j'ai un conflit sur le constructeur par défaut à appeler à savoir public Five() ou public Five(int = -1) ! Mais au contraire ça marche et ça appelle le premier constructeur par défaut.
    Je refais la même chose pour une fonction et là c'est la deuxième fonction qui est appelée ! Je trouve que déjà ça doit bloquer au niveau de la compilation et que si C# le tolère alors pq le comportement n'est pas déterministe au niveau de l'exécution
    Si qq'un a une réponse, je suis preneur. Merci

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 206
    Points : 196
    Points
    196

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 032
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 032
    Points : 5 469
    Points
    5 469
    Par défaut
    Je refais la même chose pour une fonction et là c'est la deuxième fonction qui est appelée
    Est ce que tu peux montrer ce code?
    Parceque pour ton constructeur c'est parfaitement déterministe, en effet si il existe plusieurs constructeur( ou méthode) qui répondent aux critères d'appels, alors c'est celui qui possède le moins d'argument qui est choisi.

    Ici donc le constructeur sans argument.

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2012
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par micka132 Voir le message
    Est ce que tu peux montrer ce code?
    Parceque pour ton constructeur c'est parfaitement déterministe, en effet si il existe plusieurs constructeur( ou méthode) qui répondent aux critères d'appels, alors c'est celui qui possède le moins d'argument qui est choisi.

    Ici donc le constructeur sans argument.
    Je n'ai pas réussi à reproduire le problème relatif à la surcharge des deux fonctions. Effectivement, je trouve que toujours le compilateur fait appel au constructeur sans argument et à la méthode sans arguments. Cependant, je pense qu'il ne considère pas un constructeur avec argument initialisé comme un remplaçant d'un constructeur sans argument tel est le cas de C++ par 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
    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
    90
    91
     
    using System;
    namespace tata
    {
        class One
        {
            string name;
            public One(string str = "Unknown") { name = str; }
            public override string ToString()
            {
                return name;
            }
        }
        struct Two : toto.I
        {
            string id;
            public Two(string str = "NoBody") { id = str; }
            public void doJob(string str = "NoThingOne")
            {
                System.Console.WriteLine("Bad Job 1 is Done! ({0} , {1})", id, str);
            }
            public void doJob()
            {
                System.Console.WriteLine("Bad Job 2 is Done! ({0} , NoThingTwo)", id);
            }
            public override string ToString()
            {
                return id;
            }
        }
        namespace toto
        {
            delegate int fct();
            interface I
            {
                void doJob(string str);
            }
            class Four : One
            { }
     
        }
        class Five
        {
            int member;
            public static int counter = 0;
            public Five() { System.Console.WriteLine("Instance Constructor is Called !"); }
            public Five(int m = -1) { member = m; }
            static Five() { System.Console.WriteLine("Static Constructor is Called !");  counter = 10; }
            public override string ToString()
            {
                return member.ToString();
            }
            public void bidon(int m = 0)
            {
                System.Console.WriteLine("bidon 2");
            }
            public void bidon()
            {
                System.Console.WriteLine("bidon 1");
            }
        }
     
        class Begin
        {
            static void Main(string[] args)
            {
                One o1 = new One();
                System.Console.WriteLine(o1);
                if (args.Length != 0)
                {
                    System.Console.WriteLine("Listing of all arguments passed in command line : ");
                    foreach (string str in args)
                        System.Console.WriteLine(str);
                    One o2 = new One(args[0]);
                    System.Console.WriteLine("{0} , args properties : {1} {2} {3}", o2, args.Length, args.GetLength(0), args.Rank);
                }
                else System.Console.WriteLine("At less one argument is needed in command line.");
                Two t1 = new Two();
                Two t2 = new Two("Mr.John");
                t1.doJob();
                t2.doJob("Learning");
                System.Console.WriteLine("'Two' objects values : {0} , {1}", t1, t2);
                System.Console.WriteLine("Counter value before calling static constructor: {0}",Five.counter);
                Five f1 = new Five();
                Five f2 = new Five(4);
                System.Console.WriteLine("Counter value after calling static constructor: {0}", Five.counter);
                System.Console.WriteLine("'Five' objects values : {0} , {1}", f1, f2);
                f1.bidon(2);
            }
        }
    }
    A l'exécution, j'ai cet écran d'affichage :
    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
    Unknown
    Listing of all arguments passed in command line :
    hello
    toto
    gigi
    hello , args properties : 3 3 1
    Bad Job 2 is Done! ( , NoThingTwo)
    Bad Job 1 is Done! (Mr.John , Learning)
    'Two' objects values :  , Mr.John
    Static Constructor is Called !
    Counter value before calling static constructor: 10
    Instance Constructor is Called !
    Counter value after calling static constructor: 10
    'Five' objects values : 0 , 4
    bidon 2
    Dans la structure Two, j'ai défini un seul constructeur avec un argument initialisé et qui est censé jouer le rôle à la fois d'un constructeur sans argument et d'un constructeur avec un seul argument. L'appel de t1.doJob(); a pour résultat l'affichage de cette ligne Bad Job 2 is Done! ( , NoThingTwo). le constructeur que j'ai défini n'a pas été appelé vu que ID est vide. Je déduis que le constructeur par défaut a été synthétisé par le compilateur !

  5. #5
    Membre expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 570
    Points
    3 570
    Par défaut
    Les constructeurs des types réagissent différemment des constructeurs de classes. Pour qu'un constructeur de type soit appelé, il doit être explicitement appelé. Comme tu ne l'appelle pas explicitement, il le passe et utilise le constructeur par défaut (en fait, il ne crée même pas de constructeur par défaut et initialise les champs de suite).

  6. #6
    Membre éprouvé Avatar de sisqo60
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2006
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 754
    Points : 1 188
    Points
    1 188
    Par défaut
    Bonjour,

    Par définition, le struct possède un constructeur par défaut. Si tu en avait fait une classe ça n'aurait pas compilé

    Bon dév.

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