c# - 我可以用这种方式为所有派生的单例定义一个抽象类吗?

标签 c# .net c#-4.0 singleton abstract-class

这是我的抽象类,每次我想制作一个 Singleton 时都必须派生它:

public abstract class Singleton<T> where T : Singleton<T>
{
    private static readonly Lazy<T> _instance = new Lazy<T>(() =>
    {
        var constructor = typeof(T).GetConstructor(BindingFlags.NonPublic |
            BindingFlags.Instance, null, new Type[0], null);

        return (T)constructor.Invoke(null);
    });
    public static T Instance { get { return _instance.Value; } }
    public Singleton() { }
}

因此,每次我需要遵循单例设计模式时,我可以这样做:

sealed class Server : Singleton<Server>
{
    private Server() { }
    ...
}

这是否完全正确,如果不正确,为什么?

编辑:

  • 在派生类示例中添加私有(private)构造函数并在抽象基础上调用。

编辑:

  • 重新设计了类型参数初始化。

最佳答案

不,你不能,因为当你想使用 new T() 时,你应该有一个公共(public)构造函数,它不同于单例定义。因为在单例中你应该有一个私有(private)构造函数,在这种情况下(公共(public)构造函数)每个人都可以创建你的对象的新实例并且它不是单例。

关于c# - 我可以用这种方式为所有派生的单例定义一个抽象类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8036883/

相关文章:

c# - 更改不会永久保存到 SQL Server Compact 版本中

c# - 如何获取 "friendly"操作系统版本名称?

c# - 以数字为键反序列化 JSON

c# - WPF 图像碰撞检测

c# - 应用自定义窗口样式和模板后不显示验证错误(c#、WPF)

c# - .Net4 中的 GC : Specifying gcServer and gcConcurrent together

c# - 更改关闭按钮工具提示

tinymce - 使用tinyMCE,你可以让它只输出bbcode标签吗?

asp.net - ASPX 页面上每个响应行上的四个记录

c# - 防止或禁止使用Parallel.ForEach