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 :

Appeler un contructeur et la base


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut Appeler un contructeur et la base
    Hello,

    J'ai une classe avec plusieurs versions de constructeurs (selon le nombre de paramètres).

    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
    public class B : A
    {
        int var;
     
        public B() : base()
        {
             var = 5;
        }
     
        public B(int x) : base(x)
        {
            // comment faire pour en plus de la base,
            // appeler this(), afin d'initialiser var ?
        }
    }
    J'ai l'impression que je vais devoir faire une fonction init(), appelée par chacun des constructeurs.

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2005
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2005
    Messages : 482
    Par défaut
    Faux :

    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
     
    public class B : A
    {
        int var;
     
        public B() : base()
        {
             var = 5;
        }
     
        public B(int x) : base(x)
        {
            this();
        }
    }
    lol ai pas vu le base(x) ^^

    ton base(x) est absolument nécessaire ? ne peux-tu le reprogrammer ?
    au pire tu recopies ton var = 5 ou le déportes dans une autre fonction.

  3. #3
    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
    On ne peut pas appeler un constructeur ainsi Themacleod1980. this() n'est valide que dans la déclaration du constructeur.

    Le plus simple reste de faire une méthode Init je pense. Car là c'est un exemple simple, mais je suppose que c'est un peu plus compliqué en vrai ^^

  4. #4
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    De plus cela n'a pas vraiment de sens car tu as déjà construis un objet A(x)et tu ne veux probablement pas reconstruire un autre objet A(). Comment le compilateur devrait agir ? Construire un objet B à partir de A(x) puis l'écraser pour reconstruire un objet à partir de A() ?

    Heureusement que cela n'est pas possible sinon bonjour les effets de bords.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    C'est possible en C++. Alors je veux bien accepter que ce n'est pas possible en C#, je ferai avec, mais ne me dis pas que c'est stupide. ET quand on vient d'un autre langage, il est normal de chercher à retrouver dans la mesure du possible ses habitudes de codage.

  6. #6
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Je n'ai pas dit que c'est stupide mais que cela n'a aucun sens.

    De plus tu dis que c'est impossible de le faire C# certes cependant il y a de fort doute que cela soit possible en C++ (cf. voir la FAQ C++) et quand bien même cela serait possible "bonjour les effets de bord" et l'intêret est vraiment minime (entre écrire this() ou init() )

    Edit : ok c'est possible en C++..

  7. #7
    Membre émérite Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 823
    Par défaut
    Citation Envoyé par oodini Voir le message
    Hello,

    J'ai une classe avec plusieurs versions de constructeurs (selon le nombre de paramètres).

    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
    public class B : A
    {
        int var;
     
        public B() : base()
        {
             var = 5;
        }
     
        public B(int x) : base(x)
        {
            // comment faire pour en plus de la base,
            // appeler this(), afin d'initialiser var ?
        }
    }
    J'ai l'impression que je vais devoir faire une fonction init(), appelée par chacun des constructeurs.
    as-tu des constructeurs de base différents ?

    il me semble que tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ctor():base()
    {
        init();
    }
     
    ctor(x):this()
    {
        var toto = x;
    }
    je n'ai pas testé ça, mais il me semble bien que c'est faisable.
    si tu appelles ctor(x), ça doit faire la base, puis le ctor sans param, puis enfin celui avec param.

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Citation Envoyé par kheironn Voir le message
    as-tu des constructeurs de base différents ?
    Oui. Le constructeur sans paramètres de la classe dérivée doit appeler son le constructeur sans paramètre de la classe mère, le constructeur avec un paramètre doit appeler le constructeur à 1 paramètre de la classe mère, etc.

  9. #9
    Membre émérite Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 823
    Par défaut
    Dans ce cas, oui, tu vas devoir factoriser les traitements des ctors de la classe fille. Pas le choix.

    Aurais-tu un exemple concret de classe mère avec ses ctor et d'une fille ?

  10. #10
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par oodini Voir le message
    Oui. Le constructeur sans paramètres de la classe dérivée doit appeler son le constructeur sans paramètre de la classe mère, le constructeur avec un paramètre doit appeler le constructeur à 1 paramètre de la classe mère, etc.
    Cela semble curieux; pas forcément faux, mais curieux.

    En effet, admettons que le constructeur "à paramètres" de la classe fille doit appeler un constructeur à paramètres de la classe mére, mais cela ne justifie pas que le constructeur par défaut de la classe fille doivent appeler un constructeur par défaut dans la classe mére.

    A priori déjà ces deux cas se résolvent très bien avec un constructeur unique dans la classe mére (avec deux paramètres si nécessaire, si la nullité du partamètre ne peut pas être considérée comme son absence).

    Quant à ton affectation de variable dans la classe fille, rien ne t'empêche de la faire via une méthode abstraite ou virtuelle appelée dans le contructeur de la classe mére et implémentée (ou pas, si virtuelle) dans les classes filles.

    Bref, je pense que ton problème en est peut être un de conception (pas obligatoirement,mais possible).

  11. #11
    Membre émérite Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 823
    Par défaut
    Dans mon poste précédent, je pensais aussi à un problème de conception (sans pour autan l'évoquer).
    Tu as peut-être plus de ctor que besoin.

    C'est pour ça que je demandais à voir des bout de code réelle pour en juger.

Discussions similaires

  1. Appel fonction stockée dans la base depuis forms
    Par italiasky dans le forum Forms
    Réponses: 7
    Dernier message: 20/10/2008, 13h13
  2. Réponses: 6
    Dernier message: 30/04/2008, 14h55
  3. Réponses: 7
    Dernier message: 29/11/2007, 16h03
  4. Qu'appelle t'on tuning de base de données ?
    Par meandreux dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 24/05/2007, 09h17
  5. Réponses: 5
    Dernier message: 07/04/2006, 01h18

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