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 dans classe de base et héritage


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Juin 2002
    Messages : 57
    Par défaut Singleton dans classe de base et héritage
    Bonjour,

    Est-il possible d'avoir le code du singleton dans une classe de base et ensuite d'hériter de ce code pour les nouveaux objets ?

    Wil

  2. #2
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Les membres statiques ne sont pas hérités donc tu ne peux pas gérer de cette manière l'héritage de singleton. Peut-être eventuellement en implémentant un Pattern Factory.
    Quel est le besoin derrière?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Juin 2002
    Messages : 57
    Par défaut
    Je vais avoir une dizaine d'objets fonctionnant sur le principe du singleton.
    C'est juste pour éviter de re-écrire le code.

  4. #4
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Dans ce cas la, il faut plutôt utiliser un framework comme Spring.Net ou Unity qui sont des conteneurs de singletons (en gros)

  5. #5
    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 PitMaverick78 Voir le message
    Les membres statiques ne sont pas hérités
    Si, les membres statiques sont hérités et c'est justement le problème dans son cas. Il ne peut pas masquer le membre static pour le différencier dans chaque classe héritée.

  6. #6
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Me suis mal exprimé, dans le cas d'un héritage, ca ne peut pas être redéfini!

    Voici un exemple de container gérant les singletons des classes hérités d'une classe de base:

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    void Main()
    {
    	var car = Factory<Vehicule>.GetInstance<Car>();
    	car.WhoAmI();
     
    	var boat = Factory<Vehicule>.GetInstance<Boat>();
    	boat.WhoAmI();
     
    	var plane = Factory<Vehicule>.GetInstance<Plane>();
    	plane.WhoAmI();
    }
     
    public static class Factory<T>
    {
    	private static readonly KeyedByTypeCollection<T> _instances = new KeyedByTypeCollection<T>();
     
    	public static V GetInstance<V>() where V : T, new()
    	{
    		if (!_instances.Contains(typeof(V)))
    		{
    			_instances.Add(new V());
    		}
    		return (V)_instances[typeof(V)];
    	}
    } 
     
    public abstract class Vehicule
    {
    	public abstract void WhoAmI();
    }
     
    public class Car : Vehicule
    {
    	public override void WhoAmI()
    	{
    		Console.WriteLine("I'm a car");
    	}
    }
     
    public class Plane : Vehicule
    {
    	public override void WhoAmI()
    	{
    		Console.WriteLine("I'm a plane");
    	}
    }
     
    public class Boat : Vehicule
    {
    	public override void WhoAmI()
    	{
    		Console.WriteLine("I'm a boat");
    	}
    }

  7. #7
    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,
    utilise les generics comme dit plus haut. Le fait de vouloir implémenter des classes dérivées juste pour économiser du code, ça s'appelle l'héritage d'implémentation et c'est pas bon du tout !

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Juin 2002
    Messages : 57
    Par défaut
    J'ai un souci lors de l’implémentation car le SingletonPattern doit hériter d'un objet de base.
    La syntaxe est-elle correcte :
    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
     
    public class ObjDeBase:DataTable
    {
      public ObjDeBase(string MaChaine)
      {
        ....
      }
    }
     
        public abstract class SingletonPattern<T> where T : ObjDeBase, new()
        {
            private static T fInstance;
            public static T Instance
            {
                get
                {
                    if (fInstance == null)
                    {
                        fInstance = new T();
                    }
                    return fInstance;
                }
            }
     
            private SingletonPattern(string MaChaine): base(MaChaine)
            {
            }
        }
     
    public class MySingleton : SingletonPattern<MySingleton>
    {
      private MySingleton():base("bla bla bla")
      {
      }
    }
    Sur la déclaration de MySingleton, j'ai :

    'MySingleton' doit être un type non abstrait avec un constructeur sans paramètre public afin de l'utiliser comme paramètre 'T' dans le type ou la méthode générique 'SingletonPattern<T>'

  9. #9
    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 Wil14 Voir le message
    Bonjour,

    Est-il possible d'avoir le code du singleton dans une classe de base et ensuite d'hériter de ce code pour les nouveaux objets ?

    Wil
    Bien sur. Voici un exemple classe générique d'implémentation de singleton :

    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
    	/// <summary>
    	/// Implemenatin standard singleton.
    	/// </summary>
    	/// <typeparam name="T"></typeparam>
    	public abstract class SingletonPattern<T> where T : class, new()
    	{
    		private static T _instance;
    		public SingletonPattern()
    		{
    		}
    		public static T Instance
    		{
    			get
    			{
    				if (_instance == null)
    				{
    					_instance = new T();
    				}
    				return _instance;
    			}
    		}
    	}
    après tu crées ton singleton ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class MySingleton : SingletonPattern<MySingleton>
    {
    // .. implementation de la classe.
    }
    Et tu l'utilises :


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

Discussions similaires

  1. [EF] Héritage & classe de base commune
    Par GSXRider dans le forum Framework .NET
    Réponses: 2
    Dernier message: 17/10/2009, 09h48
  2. [Doxygen] Faire apparaitre les classes de base d'un héritage
    Par MonsieurHelmut dans le forum Autres éditeurs
    Réponses: 0
    Dernier message: 14/12/2008, 01h04
  3. Réponses: 13
    Dernier message: 20/10/2008, 16h36
  4. Héritage, classe de base
    Par Melem dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 25/02/2008, 15h45
  5. Réponses: 5
    Dernier message: 10/01/2007, 02h08

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