Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我们可以继承singleton类吗?_C#_.net_Design Patterns - Fatal编程技术网

C# 我们可以继承singleton类吗?

C# 我们可以继承singleton类吗?,c#,.net,design-patterns,C#,.net,Design Patterns,我们可以继承单例类吗?它取决于实现。单例通常有私有构造函数,并且可能标记为sealed,如果是这样的话,您就不能。如果它至少受到保护,你可以。如果您只是从singleton类继承,那么结果将不是singleton,所以您应该遵循该模式并使其也是singleton。当然。为什么不呢?继承类将是基本单例类的特殊化 每个类(基类和专用类)的实例将完全分开。换句话说,它们的实例成员将指向不同的对象。只有singleton类本身才能创建实例。。。所以我支持答案是否定的。我认为您可以这样做,但是它将不再是一

我们可以继承单例类吗?

它取决于实现。单例通常有私有构造函数,并且可能标记为
sealed
,如果是这样的话,您就不能。如果它至少受到保护,你可以。如果您只是从singleton类继承,那么结果将不是singleton,所以您应该遵循该模式并使其也是singleton。

当然。为什么不呢?继承类将是基本单例类的特殊化


每个类(基类和专用类)的实例将完全分开。换句话说,它们的实例成员将指向不同的对象。

只有singleton类本身才能创建实例。。。所以我支持答案是否定的。我认为您可以这样做,但是它将不再是一个单例:D

如果您不能从单例类继承,那么您最好只使用静态方法、属性、字段和事件来实现该类

能够通过基类的静态方法(或属性)访问派生类的对象是Singleton模式的关键概念之一。引用设计模式:可重用面向对象软件的元素(Gamma等人):

适用性 在需要时使用单例模式

  • 一个类必须只有一个实例,并且客户端必须能够从已知的访问点访问该类
  • 时,唯一实例应该通过子类化进行扩展,并且客户端应该能够使用扩展实例而无需修改其代码

(我强调)

是的,你可以。保持基类构造函数受保护(而非私有)


然后可以实例化派生类,但不能实例化基类(即使在派生类的函数定义内部)。我尝试过这个方法,效果很好。

这里有一种处理派生单例的可能方法:

public abstract class Singleton<T> where T : Singleton<T>, new() {

    private static readonly T s_instance = new T();

    protected Singleton() {
        if (s_instance != null) {
            string s = string.Format(
                "An instance of {0} already exists at {0}.instance. " +
                "That's what \"Singleton\" means. You can't create another.",
                typeof(T));
            throw new System.Exception(s);
        }
    }

    public static T instance { get { return s_instance; } }
}

public class MyClass : Singleton<MyClass> {


}
公共抽象类Singleton,其中T:Singleton,new(){
私有静态只读T s_实例=新T();
受保护的单例(){
如果(s_实例!=null){
string s=string.Format(
“{0}的实例已存在于{0}.instance。”+
“这就是‘单身’的意思。你不能再创造另一个。”,
(T)型;
抛出新系统异常;
}
}
公共静态T实例{get{return s_instance;}}
}
公共类MyClass:Singleton{
}

您将在下面的链接中得到答案-@Sachin不幸的是,您链接到的已接受答案不正确。如果我创建多个派生类,每个派生类都继承自singleton类,该怎么办。每个派生类将创建一个singleton类的实例。如果我创建多个派生类,每个派生类都从singleton类继承,该怎么办。我认为构造函数对于singleton必须是私有的(不能被保护)class@AtulSureka你可以创造你喜欢的任何东西。问题是你想要实现什么。规范单例应该有私有构造函数,但这并不意味着必须有私有构造函数。我可以看到很多可能有用的单例变体,包括受保护的构造函数,甚至是公共构造函数。还请记住,您始终可以使用反射调用私有构造函数,因此解决方案的可用性最终是重要的。此外,您可能希望将MyClass密封。这不起作用。MyClass必须有一个公共构造函数。这意味着您可以拥有任意多的实例。Jay,你可以通过构造函数创建一个新实例,这一点是正确的。但是,如果您尝试这样做,它将抛出一个异常。我提供的是运行时解决方案,而不是编译时解决方案,但这是我能想到的最好的解决方案。