2

我已经声明了一个带有受保护构造函数的单例类,并在其他类中派生。所以派生类实例可以是单例,也可以不是。

有没有办法让派生类也保持单例?

4

3 回答 3

2

这是我使用的良好线程安全单例类的列表:

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;
        }
    }
  }
}

创建派生类非常简单:

class CredentialsManager : Singleton<CredentialsManager>

但通常在项目中拥有超过 1 个单例类并不是一个很好的解决方案。我有 4 个 :)

于 2013-08-01T06:14:04.203 回答
0

这取决于实施。单例通常具有私有构造函数并且可能标记为密封,如果单例类具有私有构造函数,您将无法继承它。如果它至少受到保护,你可以。如果您只是从单例类继承,则结果不会是单例,因此您应该遵循该模式并将其设为单例。

于 2013-08-01T05:50:28.303 回答
0

通常单例类是密封的(将阻止继承),因此派生类不会破坏单例。

但是如果必须从类派生,那么派生类可以选择实现为Singleton。但是您不能仅使用继承过程来强制执行它。

于 2013-08-01T05:48:33.213 回答