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 :

Construction base(), this()


Sujet :

C#

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 21
    Points : 20
    Points
    20
    Par défaut Construction base(), this()
    Bonjour,

    Soit :

    Une classe de base à un constructeur par défaut qui initialise par défaut les variables internes
    Une classe dérivée à aussi un constructeur par défaut qui initialise les variables spécifiques à cette classe.
    La classe de base possède un autre constructeur qui accepte un argument d'initialisation et qui appelle son constructeur par défaut pour les autres variables via base().
    La classe dérivée elle aussi possède ce nouveau constructeur avec le même type de paramètre.
    Je voudrais que ce constructeur appelle ET le constructeur par défaut de la classe dérivée (pour continuer l'initialisation des variables propres à la classe dérivée) ET le constructeur avec paramètre de la classe de base (pour ne pas répéter ce que fait la classe de base)

    Ci joint, un bout de code expliquant mon problème

    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
    class Vehicule
    {
    	public Color couleur;
    	public string Marque;
    	Vehicule()
    	{
    		couleur = Color.Black;
    		Marque = "";
    	}
    
    	Vehicule(string marque) : this()
    	{
    		Marque = marque;
    	}
    }
    
    class Voiture : Vehicule
    {
    	public int Categorie;
    	Voiture() : base()
    	{
    		Categorie = Berline;
    	}
    
    	Voiture(string marque) : base(marque) + this()
    	{
    		//je voudrais que ce constructeur appelle :
    		//ET le constructeur base(String)
    		//ET le constructeur this()
    	}
    }
    Malheureusement, je ne peux mettre que base(marque) OU this() et, moi, je veux que les deux soient appelés pour de pas avoir à dupliquer de code.

    Merci pour votre aide,

    PurL

  2. #2
    Membre habitué
    Homme Profil pro
    Architecte C#
    Inscrit en
    Février 2003
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte C#

    Informations forums :
    Inscription : Février 2003
    Messages : 78
    Points : 144
    Points
    144
    Par défaut
    bonjour, pourquoi pas le code 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
     
    class Vehicule:MaClasseMere
    {
    	public Color couleur;
    	public string Marque;
    	Vehicule():this(string.Empty)
    	{
    		couleur = Color.Black;
    	}
     
    	Vehicule(string marque) : base(MesAutresParametresParDefaut)
    	{
    		Marque = marque;
    	}
    }
    Bonnes fêtes

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 21
    Points : 20
    Points
    20
    Par défaut
    Merci de ta réponse.
    Si je ne me trompe pas, avec ton code, si on fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Vehicule v = new Vehicule("renault");
    Ça n’appellera pas le constructeur par défaut de Vehicule.

    Pour simplifier mon probleme :

    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
    class A
    {
        A()
        {
        }
     
        A(int)
        {
        }
    }
     
    class B : A
    {
        B()
        {
        }
     
        B(int)
        {
        }
    }
    quand je fais :
    Je voudrais que soient appelés les constructeurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    A()
    A(int)
    B()
    B(int)
    Bonnes fêtes à toi aussi et à tous les membres du forum.

    PurL

  4. #4
    Membre habitué
    Homme Profil pro
    Architecte C#
    Inscrit en
    Février 2003
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte C#

    Informations forums :
    Inscription : Février 2003
    Messages : 78
    Points : 144
    Points
    144
    Par défaut
    Dans ce cas, pourquoi ne pas faire en sorte que ton constructeur vide renvoie vers ton constructeur rempli avec des paramètres par défaut ?

    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
     
    class A
    {
        A():this(0)
        {
        }
     
        A(int)
        {
        }
    }
     
    class B : A
    {
        B():this(0)
        {
        }
     
        B(int):base(b)
        {
        }
    }
    Au final, le constructeur vide ne servira qu'a rediriger vers le constructeur plus rempli qui, lui, fait toute l'initialisation

    Un petit exemple ci-dessous :

    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
     
    public class Toto
            {
                public Color Couleur { get; set; }
                public int Age { get; set; }
     
                public Toto():this(18)
                {
     
                }
     
                public Toto(int age)
                {
                    Couleur = Color.Black;
                    Age = age;
                }
            }
     
            public class Titi:Toto
            {
                public string Marque { get; set; }
     
                public Titi():this(string.Empty)
                {
     
                }
     
                public Titi(string marque):base(20)
                {
                    Marque = marque;
                }
            }

  5. #5
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Pas possible.

    Par contre, sdans ton cas, tes constructeurs ne font qu'assigner des valeurs aux membres, tu n'en as pas besoin: il suffit de le faire dès la déclaration. Et du coup, ça se fera quel que soit le constructeur utilisé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class Vehicule
    {
    	public Color couleur = Color.Black;
    	public string Marque= "";
    	public Vehicule()
    	{
    	}
     
    	public Vehicule(string marque)
    	{
    		Marque = marque;
    	}
    }

  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,

    En fait, c'est possible. Personne n'a relevé, mais regardes bien tes constructeurs, ils sont tous private... Essayes de les mettre en internal ou public et voire même protected pour certains. A toi de voir comment tu veux qu'on instancie les objets de ta classe. Mais avec le code que tu nous as founi, tu ne peux en aucun cas faire le code suivant ailleurs que dans la classe voiture et les constructeurs de véhicule sont private, dont quoi qu'il arrrive ça ne peut pas compiler.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Voiture v = new Voiture
    Sinon si tu veux que tous tes constructeurs soient appelés (idée que je ne comprends pas par rapport au code que tu as posté, mais j'espère qu'il y a une raison technique et que c'est ni plus ni moins un exemple pour que ça parle à tout le monde ), il faut que tu fasse un code du genre :

    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
        internal class Vehicule
        {
            public Color couleur;
            public string Marque;
            internal Vehicule()
            {
                couleur = Color.Black;
                Marque = "";
            }
     
            internal Vehicule(string marque)
                : this()
            {
                Marque = marque;
            }
        }
     
        internal class Voiture : Vehicule
        {
            public int Categorie;
     
            internal Voiture()
                : base(string.Empty)
            {
               Categorie = 0;
             }
     
            internal Voiture(string marque)
                : this()
            {
                //je voudrais que ce constructeur appelle :
                //ET le constructeur base(String)
                //ET le constructeur this()
                Marque = marque;
            }
        }
    Bonnes fêtes et bon dev...

Discussions similaires

  1. [MySQL] Construction base de données
    Par GWBCLT dans le forum PHP & Base de données
    Réponses: 46
    Dernier message: 12/05/2009, 09h13
  2. [MySQL] Construction d'un flux RSS à partir de la base : résultats partiels
    Par atchoumen dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 06/07/2007, 19h13
  3. Réponses: 4
    Dernier message: 12/08/2006, 13h07
  4. Construction d'une base "Questionnaire"
    Par elvis.regnier dans le forum Access
    Réponses: 1
    Dernier message: 23/06/2006, 20h39
  5. probleme construction base de donnes MySql...Help
    Par chakan dans le forum Requêtes
    Réponses: 7
    Dernier message: 21/07/2004, 11h27

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