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
Version imprimable
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
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?
Je vais avoir une dizaine d'objets fonctionnant sur le principe du singleton.
C'est juste pour éviter de re-écrire le code.
Dans ce cas la, il faut plutôt utiliser un framework comme Spring.Net ou Unity qui sont des conteneurs de singletons (en gros)
Bien sur. Voici un exemple classe générique d'implémentation de singleton :
après tu crées ton singleton ainsi :Code:
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; } } }
Et tu l'utilises :Code:
1
2
3
4 class MySingleton : SingletonPattern<MySingleton> { // .. implementation de la classe. }
Code:MySingleton.Instance
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:
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"); } }
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 !
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 :
Sur la déclaration de MySingleton, j'ai :Code:
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") { } }
Citation:
'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>'
Oui ton constructeur est en private, il ne peut pas être construit dans le getter lorsque tu fais un new T();
J'ai passé le constructeur en public seulement j'ai une nouvelle erreur :
Citation:
Le type 'MySingleton ne peut pas être utilisé comme paramètre de type 'T' dans le type ou la méthode générique 'SingletonPattern<T>'. Il n'y a pas de conversion de référence implicite de 'MySingleton' en 'ObjDeBase'.
Edit: Erf j'ai dit des betises!
Il semblerait que dans le code de le code de BlueDeep tu ne peux pas dire que MySingleton herite de la ObjDeBase. Il va falloir que tu passes par mon code haha :D
(A confimer par BlueDeep)
Ca fonctionne en appelant :
MerciCode:SingletonPattern<MySingleton>.Instance