在C#中实现单例可继承类[duplicate]

问题描述 投票:8回答:2
我发现在C#中,您可以实现Singleton类,如下所示:

class Singleton { private static Singleton _instance; public static Singleton Instance { get { return _instance ?? (_instance = new Singleton()); } } protected Singleton() { } }

这适用于Singleton类型的实例,即:

var a = Singleton.Instance; var b = Singleton.Instance; Console.WriteLine(ReferenceEquals(a, b)); //Prints True.

但是如果我希望Singleton的派生类也遵循Singleton模式,即:

class A:Singleton { ... } A a = A.Instance;

在这种情况下,静态成员InstanceSingleton类访问,并创建一个Singleton实例,这不是目标。此外,此解决方案还有两个主要问题:

    派生类可以实现自己的构造函数,并失去Singleton模式。
  • 如果存在Singleton的另一个实例,则派生类将引用该较少派生的实例
  • 我的问题是:是否有另一种方法可以在C#中实现Singleton类,以确保派生类也是singleton?

  • c# inheritance singleton
    2个回答
    21
    投票
    忽略通常的“不要使用Singleton,请看一下您的设计。”参数,您可以想象这样实现一个参数(假设您的派生类具有默认构造函数):

    public abstract class Singleton<T> where T : class, new() { private static T _instance; public static T GetInstance() { if(_instance == null) _instance = new T(); return _instance; } }

    因此得出:

    public class SingletonA : Singleton<SingletonA> { /* .... */ } public class SingletonB : Singleton<SingletonB> { /* .... */ }

    但是,我真的不个人提倡这种单例方法。它们确实有其(很少)用途,但事实证明,它们更像是在痛苦中-转向荣耀的全局变量容器。

    还请注意线程安全性。


    3
    投票
    我的问题是:还有另一种方法可以在C#中实现Singleton类,以确保派生类也是singleton?

    嗯,您

    可以在构造函数中进行了以下检查:

      密封this的实际类型
    • this的实际类型是Singleton的直接子类
    • 尚未创建该类型的其他实例(通过保持HashSet<Type>
  • 但是,似乎没有意义。您的基类实际上意味着什么?

    单例模式为easy to implement properly(顺便说一下,您的示例没有-线程不安全),那么为什么有基类呢?基类本身不会是单例(可能会有很多实例-每个子类一个实例),那么这样做有什么好处?

    在我看来,“我是对象的实际类型的单例”一开始并不是继承的适当基础,坦率地说,无论如何,我都会尽量避免使用单例模式。

    如果您真的想要基类,那应该是因为所有子类都自然地继承了一些通用功能。这些子类是否为单例,这不太可能

    固有地

  • © www.soinside.com 2019 - 2024. All rights reserved.