2013-08-01 3 views
2

J'ai déclaré une classe singleton avec un constructeur protégé et dérivée dans d'autres classes. Donc, l'instance de classe dérivée peut être singleton ou non.Héritage de classe Singleton

Y a-t-il un moyen de garder les classes dérivées aussi singleton?

+3

pourquoi ferez-vous cela? –

+0

C'est possible jusqu'à ce que votre classe ne soit pas "scellée" – wudzik

+0

C'est au développeur qui crée/utilise la classe dérivée. Si vous ne leur faites pas vraiment confiance, ne leur permettez pas d'hériter de votre classe. – aroth

Répondre

0

Habituellement, les classes Singleton sont scellées (empêcheront l'héritage), donc les classes dérivées ne ruineront pas le singleton.

Mais si vous devez dériver de la classe, alors la classe dérivée peut choisir pour être implémentée en tant que singleton. Mais vous ne pouvez pas l'appliquer uniquement en utilisant le processus d'héritage seul.

0

Cela dépend de la mise en œuvre. Les singletons ont généralement un constructeur privé et peuvent être marqués comme scellés, si la classe singleton a un constructeur privé, vous ne pourrez pas en hériter. Si c'est au moins protégé, vous pouvez. Si vous venez d'hériter de la classe singleton, le résultat ne sera pas singleton, donc vous devriez suivre le modèle et le rendre aussi singleton.

2

Voici une liste de bonne classe singleton thread-safe j'utiliser:

namespace Helpers.DesignPatterns 
{ 
public class Singleton<T> where T : class 
{ 
    private static volatile T _instance; 
    private static object _syncRoot = new Object(); 

    protected Singleton() 
    { 
    } 

    private static T CreateInstance() 
    { 
     ConstructorInfo cInfo = typeof(T).GetConstructor(
      BindingFlags.Instance | BindingFlags.NonPublic, 
      null, 
      new Type[0], 
      new ParameterModifier[0]); 

     return (T)cInfo.Invoke(null); 
    } 

    /// <summary> 
    /// Точка входа синглтона 
    /// </summary> 
    public static T Instance 
    { 
     get 
     { 
      if (_instance == null) 
      { 
       lock (_syncRoot) 
       { 
        if (_instance == null) 
         _instance = CreateInstance(); 
       } 
      } 

      return _instance; 
     } 
    } 
    } 
} 

Il est extrêmement simple de créer la classe derieved:

class CredentialsManager : Singleton<CredentialsManager>

Mais généralement, ce n'est pas un très bon solution pour avoir plus d'une classe singleton dans le projet. J'ai 4 dans le mien :)

+0

+ раз pour la patrie – Alex