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 :

[C# 1.1]Comment implementer héritage d'une classe Singleton?


Sujet :

C#

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 13
    Points : 10
    Points
    10
    Par défaut [C# 1.1]Comment implementer héritage d'une classe Singleton?
    Je voudrais faire une classe Singleton, héritable par d'autres:

    en cpp j'aurais fait:
    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
     
    template <class T>
    class Singleton
    {
    public :
        static T& getInstance()
        {
            if (!Inst)
                Inst = new T;
     
            return *Inst;
        }
     
    protected :
        Singleton() {}
     
    private :
        static T* Inst = null;
     
    };
     
    // pour pouvoir faire:
    class A : Singleton {...}
     
    A.getInstance();

    Seulement en c# 1.1, pas de generics, et du coup je ne vois pas trop comment faire? Ce serait dommage de réécrire dans chaqu'une de mes functions l'implémentation de Singleton.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    Si le singleton est une instance d'une classe que tu définis, il est possible d'utiliser une classe Static, l'effet est quasiment le même.

    S'il s'agit d'une classe non static d'une bibliothèque à utiliser comme singleton, je ne vois pas de technique générique en fw 1.1.

  3. #3
    Expert éminent
    Avatar de Ditch
    Inscrit en
    Mars 2003
    Messages
    4 160
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mars 2003
    Messages : 4 160
    Points : 9 634
    Points
    9 634
    Par défaut
    Citation Envoyé par NicolasG
    Si le singleton est une instance d'une classe que tu définis, il est possible d'utiliser une classe Static, l'effet est quasiment le même.

    S'il s'agit d'une classe non static d'une bibliothèque à utiliser comme singleton, je ne vois pas de technique générique en fw 1.1.
    Si ce n'est que static ne se met pas dans la même zone mémoire.

  4. #4
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 83
    Points : 100
    Points
    100
    Par défaut
    • Je ne vois en effet pas trop comment faire en 1.1
    • Je l'ai fait en 2.0, mais en pratique, l'intérêt s'avère limité : si la classe ciblée doit déjà hériter d'une autre classe, c'est inapplicable, et de plus, le pattern Singleton n'est traduit qu'au travers de la propriété Instance puisque la classe devra disposer d'un constructeur publique pour pouvoir être instanciée par le template générique.
    • Je sais bien que l'implémentation que tu utilises est celle que l'on retrouve un peu partout, mais ça reste une mauvaise implémentation.
      cf. Implementing the Singleton Pattern in C#

  5. #5
    Expert éminent
    Avatar de Ditch
    Inscrit en
    Mars 2003
    Messages
    4 160
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mars 2003
    Messages : 4 160
    Points : 9 634
    Points
    9 634
    Par défaut
    - En 1.1 comme en 2.0.
    - Il ne faut pas qu'elle hérite d'une autre classe.
    - En quoi cela est une mauvaise implémentation? Tu as une et une classe classe instanciée... Ce n'est pas le principe du singleton?

  6. #6
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 83
    Points : 100
    Points
    100
    Par défaut
    En quoi cela est une mauvaise implémentation?
    Pas thread-safe. Cf. le lien fourni.

    En 1.1 comme en 2.0
    ??
    On ne doit pas parler de la même chose... La question de départ est : comment coder une classe qui permet de factoriser le pattern Singleton ?
    En 2.0, c'est faisable (avec les restrictions citées) grâce aux génériques. En 1.1 : ?

  7. #7
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    J'avais déja lu les exemples de "Implementing the singleton pattern C#", seulement dans ses exemples il ne montre pas l'application pratique en héritage avec d'autres classes.
    En pratique l'utilité d'un singleton c'est justement que toutes mes classes voulues puissent en hériter et devenir un singleton sans avoir à tout coder.
    Sauf que là dans tous les cas en faisant un getInstance(), j'aurais toujours un objet de type "Singleton" et non "MaClasse_qui_hérite".
    Du coup à chaque fois obligé de caster. Enfin je ne vois pas d'autre solutions (avec la contrainte de version biensur).

    Pour le lock, oui dans l'exemple cpp il n'y ait pas, mais bon suffit de l'ajouter si on a besoin d'un threadSafe, c'est pas trop ce coté de l'implémentation qui me pose pb.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    Citation Envoyé par Ditch
    Si ce n'est que static ne se met pas dans la même zone mémoire.
    Oui. Est-ce que tu connais une contre indication?

    Pour ma part, je persiste à préférer la classe static.
    Si l'objectif est de créer une classe qui doit hériter de SingletonClass pour être un singleton, autant implémenter une classe static.

  9. #9
    Expert éminent
    Avatar de Ditch
    Inscrit en
    Mars 2003
    Messages
    4 160
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mars 2003
    Messages : 4 160
    Points : 9 634
    Points
    9 634
    Par défaut
    La zone dans laquelle les objets statiques sont créés est beaucoup plus petite que la zone gérée par le stack. Puis il y avait une autre raison mais j'ai oublié laquelle Ceci dit c'était déjà pareil en C, en C++, en java etc. Le principe est le même.

    Je vais pas trop rentrer dans les détails car je ne maîtrise pas assez le sujet pour en faire un blabla. (Maniak, si tu passes par là, ...)

    Par ailleurs, le static sera instantié dès le début de l'application tandis que le singleton uniquement à partir du premier besoin.

    Enfin, j'espère que je ne me plante pas

  10. #10
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 83
    Points : 100
    Points
    100
    Par défaut
    Par ailleurs, le static sera instantié dès le début de l'application tandis que le singleton uniquement à partir du premier besoin.
    Seulement si la classe n'est pas marquée avec l'attribut BeforeFieldInit (et encore, ce n'est pas garanti).
    En revanche, si la classe n'est pas marquée avec cet attribut (ce qui sera le cas si elle dispose d'un constructeur statique : constructeur statique => pas de BeforeFieldInitAttribute), elle ne sera initialisée qu'au premier besoin.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    Après réflexion, l'emplacement en mémoire me semble équivalent.

    Une classe static contient des membres managés gérés par le GC tout comme une instance.
    Il me semble que cela ne fait aucune différence.

    L'inconvénient du pattern singleton est surtout au niveau du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //usage d'une classe static
    MyStaticClass.MyStaticMethode();
     
    //usage d'une classe singleton
    MySingleton.GetInstance().MyMethode();
    C'est plus élégant sans le GetInstance() 8)

  12. #12
    Expert éminent
    Avatar de Ditch
    Inscrit en
    Mars 2003
    Messages
    4 160
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mars 2003
    Messages : 4 160
    Points : 9 634
    Points
    9 634
    Par défaut
    Citation Envoyé par NicolasG
    Après réflexion, l'emplacement en mémoire me semble équivalent.

    Une classe static contient des membres managés gérés par le GC tout comme une instance.
    Il me semble que cela ne fait aucune différence.
    Vais essayer de retrouver ce superbe article que j'avais vu. Sinon y a quoi servirait d'avoir plusieurs zones mémoires ?

    Citation Envoyé par NicolasG
    L'inconvénient du pattern singleton est surtout au niveau du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //usage d'une classe static
    MyStaticClass.MyStaticMethode();
     
    //usage d'une classe singleton
    MySingleton.GetInstance().MyMethode();
    C'est plus élégant sans le GetInstance() 8)
    Une propriété Instance c'est bien aussi et ca donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MySingleton.Instance.MyMethode();

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut
    Citation Envoyé par Ditch
    Je vais pas trop rentrer dans les détails car je ne maîtrise pas assez le sujet pour en faire un blabla. (Maniak, si tu passes par là, ...)
    Je suis censé maîtriser ce sujet-là ? :)

    Pour autant que je sache, les seules variations dans l'allocation de mémoire sont en fonction de si un objet est de type valeur ou référence.

    Éventuellement, ça part peut-être directement (ou du moins plus rapidement) en génération 2 vu que ce sont des données avec une durée de vie plus longue que la moyenne ? Sais pas. Pas vraiment d'importance de toute façon :)

    Citation Envoyé par Ditch
    Par ailleurs, le static sera instantié dès le début de l'application tandis que le singleton uniquement à partir du premier besoin.
    Pas tout à fait.

    (zou, zappage du petit blabla vu qu'après lecture de la suite du topic, Wyatan a déjà dit la même chose, à un détail près :)

    Cf http://www.yoda.arachsys.com/csharp/beforefieldinit.html de toute façon, qui est directement lié au lien de Wyatan au début du topic :)

    C'est un peu là-dessus que joue la 4è version de singleton :)

    Citation Envoyé par Wyatan
    Par ailleurs, le static sera instantié dès le début de l'application tandis que le singleton uniquement à partir du premier besoin.
    Seulement si la classe n'est pas marquée avec l'attribut BeforeFieldInit (et encore, ce n'est pas garanti).
    Y a pas une petite inversion là ? :)

    Citation Envoyé par Wyatan
    En revanche, si la classe n'est pas marquée avec cet attribut (ce qui sera le cas si elle dispose d'un constructeur statique : constructeur statique => pas de BeforeFieldInitAttribute), elle ne sera initialisée qu'au premier besoin.
    Et donc quand il n'y a pas de constructeur statique, elle est marquée avec BeforeFieldInit et initialisée quelque part avant le premier accès, potentiellement dès le début de l'appli mais pas forcément :)

    (enfin on est d'accord, on lit la même page :)

  14. #14
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    donc finalement, j'ai opté pour une classe Singleton dont j'hérite puis je suis obligé de caster.

    donc concretement quand j'utilise une classe qui hérite de singleton:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ((ClasseQuiHerite)ClasseQuiHerite.getInstance()).Methode();
    sauf qu'a l'exécution il n'aime pas mon cast, faut caster comment en c# ?

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    Citation Envoyé par CyberCouf
    donc finalement, j'ai opté pour une classe Singleton dont j'hérite puis je suis obligé de caster.

    donc concretement quand j'utilise une classe qui hérite de singleton:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ((ClasseQuiHerite)ClasseQuiHerite.getInstance()).Methode();
    sauf qu'a l'exécution il n'aime pas mon cast, faut caster comment en c# ?
    Le cast n'est possible que si getInstance() renvoie un objet créé par un new ClasseQuiHerite() et non un new ClasseDeBase().

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

Discussions similaires

  1. Conception: héritage d'une classe abstraite
    Par Kikito dans le forum Langage
    Réponses: 19
    Dernier message: 05/10/2006, 17h36
  2. Héritage d'une class "primaire"
    Par sloshy dans le forum Général Python
    Réponses: 6
    Dernier message: 06/05/2006, 15h24
  3. Réponses: 8
    Dernier message: 22/03/2006, 18h24
  4. Héritage d'une classe en css
    Par picomz dans le forum Mise en page CSS
    Réponses: 7
    Dernier message: 27/12/2005, 16h10
  5. Héritage d'une classe thread
    Par SamCB500 dans le forum MFC
    Réponses: 4
    Dernier message: 07/07/2005, 15h35

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