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 :

changer l'ordre d'éxécution des constructeurs dans une classe dérivée


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 41
    Points : 28
    Points
    28
    Par défaut changer l'ordre d'éxécution des constructeurs dans une classe dérivée
    Bonjour,

    soit une classe A avec un constructeur A(), et une classe B dérivant de A avec un constructeur B() : base(). Si je créé un objet B par , alors le constructeur A() sera d'abord appelé, suivi de B(). Comment faire pour que ce soit d'abord le constructeur B() qui soit appelé?

    Merci

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Salut,

    Impossible, c'est inhérent au langage et c'est en général voulu (sinon dans le constructeur de B tu pourrais accéder à des membres de A non initialisés).
    Qu'est ce qui te pose problème exactement, tu as peut être un problème de design à régler ?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 41
    Points : 28
    Points
    28
    Par défaut
    Alors en gros, j'ai une classe abstraite A avec une propriété TableName, et un constructeur qui effectue une requête dans une base de données sur la table TableName. Toute classe dérivant de A doit donner une valeur à cette propriété TableName, de telle sorte que la requête marche.
    Donc dans le constructeur dérivé, j'aurais aimé d'abord initialiser la propriété TableName avec une valeur "MaTable", et ensuite appeler le constructeur A() pour effectuer la requête.
    Une idée?

  4. #4
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Si tu veux que cette propriété soit forcément renseigner, pkoi ne pas passer par une interface ?

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 41
    Points : 28
    Points
    28
    Par défaut
    Parce que j'ai besoin que le constructeur éxécute toujours un certain morceau de code, et on ne peut pas définir de corps de méthode dans une interface.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Pourquoi ne pas passer le paramètre TableName comme argument du constructeur ? C'est la solution logique et simple à ton problème.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 41
    Points : 28
    Points
    28
    Par défaut
    C'est une possibilité, mais ça signifie que je dois passer en argument la même chaine de caractères pour tous les objets de la classe B : A. En effet, de ma classe abstraite A vont dériver plusieurs classes (B, C, ...), chacune dépendant d'une seule table de la base de données. Tous les objets de la classe B, par exemple, devront avoir leur propriété TableName égale à "TableB".

    Bon en fait je viens de trouver une solution, mais je ne sais pas si elle est "propre".

    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
    public abstract class A
    {
      public abstract string TableName
      {
        get;
      }
     
      public A()
      {
        // Requête SQL sur la table this.TableName
      }
    }
     
    public class B : A
    {
      public override string TableName
      {
        get
        {
          return "TableB";
        }
      }
     
      public B() : base A()
      {
        // Constructeur B
      }
    }
    }

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    ça me semble pas mal. Il faut juste faire attention à une chose c'est que qd on se trouve dans le constructeur de A celui de B n'a pas encoré été appelé. Si alors tu appeles une méthode de B celle-ci pourrait manipuler des variables encore non initialisées. Dans ton cas tout va bien puisque la propriété TableName ne fait que renvoyer une constante.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 41
    Points : 28
    Points
    28
    Par défaut
    Ok, merci beaucoup pour ton aide!

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

Discussions similaires

  1. Changer l'ordre d'affichage des projets dans netbeans
    Par Elendhil dans le forum NetBeans
    Réponses: 0
    Dernier message: 25/02/2013, 17h04
  2. Changer l'ordre d'apparition des colonnes dans un LOV
    Par roby_rou dans le forum Oracle
    Réponses: 2
    Dernier message: 07/05/2010, 21h25
  3. Ordre d'affichage des control dans une form
    Par bipcpp dans le forum Windows Forms
    Réponses: 3
    Dernier message: 09/12/2009, 20h08
  4. préciser le type des objets dans une classe dérivée d'arraylist
    Par JCD21 dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 28/06/2008, 18h04
  5. Réponses: 6
    Dernier message: 17/06/2008, 11h28

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