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 :

Singleton et héritage..


Sujet :

C#

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 310
    Par défaut Singleton et héritage..
    Bonjour,
    J'ai toujours le même problème avec cet héritage !
    Voilà mon code puis 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
    class A    // pattern singleton
    {
      private static A instance = null;
     
      protected A() { ... }
     
      public static A GetInstance()
      {
        if(instance == null)
              instance = new A();
       return instance;
      }
    }
     
    class B  :  A
    {    // pattern singleton
     
      private static B instance = null;
     
      private B() { ... } 
     
      public static B GetInstance()
      {
        if(instance == null)
              instance = new B();
       return instance;
      }
    }
    Problème :
    1. J'appelle B.GetInstance()
    2. instance étant null, appel du constructeur B()
    3. B() appel alors dans la classe parente A le constructeur A() !
    Donc mon singleton A ne sert a rien, puisque A.GetInstance() n'est pas appelé.

    J'aimerai alors, qu'au lieu que le constructeur B() appelle le constructeur A(), il appelle plutot A.GetInstance().
    Est-ce possible ? Si oui comment ?
    Si non, que faut-il remanier ?

    Merci !

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 114
    Par défaut
    Bonjour,

    A partir du moment ou tu utilise l'héritage, quand tu construit un objet il appel un constructeur pour sa classe parente.

    Si l'héritage n'est pas essentiel, regarde plutot du coté de la composition avec quelquechose dans ce goût la:

    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
    class A    // pattern singleton
    {
      private static A instance = null;
     
      protected A() { ... }
     
      public static A GetInstance()
      {
        if(instance == null)
              instance = new A();
       return instance;
      }
    }
     
    class B 
    {    // pattern singleton
     
      private A _a = A.GetInstance();
      private static B instance = null;
     
      private B() { ... } 
     
      public static B GetInstance()
      {
        if(instance == null)
              instance = new B();
       return instance;
      }
    }
    Si tu as besoin de faire de l'heritage, je pense que le mieux serait d'extraire une interface commune à A et B à utiliser pour l'héritage et d'utiliser la composition pour tout ce qui est interaction entre les classes (voir même directement utiliser les methodes GetInstance de tes singleton)

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 310
    Par défaut
    Merci je vais tester.

    En fait dans ma classe B j'aurais surtout besoin d'avoir accès à une variable de A.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class A
    {
      private static A instance = null;
      public string class_B_aBesoinDeMoi = null;
      ...
    }
    Je ne sais pas si ca peut justifier l'héritage en effet.
    Je vais tester la composition.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 99
    Par défaut
    Exemple à NE PAS UTILISER mais qui répond à ta question.
    A mon avis, tu as un problème de conception.
    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 A    // pattern singleton
    {
         private static A instance = null;
         private static readonly B b = B.GetInstance();
     
         protected A() { instance = this;  }
     
         public static A GetInstance()
         {
              if (instance == null)
                   instance = new A();
              return instance;
         }
    }
     
    class B : A
    {    
         // pattern singleton
         private static readonly B instance = new B();
     
         private B() { }
     
         public static B GetInstance()
         {
              return instance;
         }
    }
     
    A a = A.GetInstance();
    B b = B.GetInstance();
    System.Diagnostics.Debug.Assert(a == b);

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 310
    Par défaut
    Ok merci.

    Mon but est de faire :
    - J'ai une classe Terre qui créé la Terre, (je ne dois pas y toucher)
    - la classe terrain est un terrain (il doit n'y en avoir qu'un seul, d'où le singleton)
    - la classe maison est une maison (unique aussi) sur ce terrain.
    (- possibilité de rajouter une classe C qui serait un cabanon à la maison, sur le terrain..)

    Pour ajouter la maison au terrain, je créé d'abord la terre, puis le terrain, puis j'ajoute la maison au terrain, comme le code ci dessous.

    Est-ce bon niveau conception ? Si non, je ne vois pas comment faire ?!

    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
    class terrain
    {
     private static terrain instance = null;
     public Terre root = null;
     
     private terrain()
     {
      root = new creerTerre();
     }
     
     public static terrain GetInstance()
     {
      if (instance == null)
       instance = new A();
      return instance;
     }
    }
     
    class maison
    {
     private static maison instance = null;
     private terrain monTerrain = terrain.GetInstance(); // pour récupérér l'objet
     
     private maison()
     {
      // ajoute la maison
      maMaison = monTerrain.root.Add("maison");
      // j'ai besoin de récupérer "root" qui est dans la classe Terrain !
     }
     
     public static B GetInstance()
     {
      if (instance == null)
       instance = new B();
      return instance;
     }
    }

  6. #6
    Membre chevronné Avatar de MetalGeek
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 412
    Par défaut
    Salut,

    ton pattern singleton ne peut pas être strict si tu laisse ta classe non sealed. En effet, rien n'empêche alors de référencer l'assembly, hériter de la classe de base et appeler le constructeur protected.

    Je pense que tu devrais laisser tomber l'héritage sur ce coup-là. Si le but était l'abstraction, utilise plutôt des interfaces.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 310
    Par défaut
    Salut,
    Merci pour ton aide.
    Je connais les interfaces mais dans mon cas je ne vois pas en quoi cela pourrait m'aider. Mon but n'est pas d'interfacer les éléments, du moins, je ne pense pas que l'interface puisse m'aider, sauf oubli de ma part.

    Comment feriez-vous mon scénario de votre coté ? L'héritage ne semble pas obligatoire, mais alors comment récupérer un objet (unique) d'un classe A quand on est dans une classe B ?

    Merci.

Discussions similaires

  1. Réponses: 3
    Dernier message: 25/04/2012, 16h53
  2. Réponses: 2
    Dernier message: 20/05/2011, 13h15
  3. Template, Singleton et Héritage
    Par al2000 dans le forum C#
    Réponses: 3
    Dernier message: 19/04/2009, 20h21
  4. [Singleton] [Java] Singleton et héritage
    Par Didier 69 dans le forum Design Patterns
    Réponses: 4
    Dernier message: 13/01/2007, 12h18
  5. Réponses: 14
    Dernier message: 02/02/2006, 18h32

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