Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.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#_Inheritance_Singleton - Fatal编程技术网

C# 派生类应始终为singleton

C# 派生类应始终为singleton,c#,inheritance,singleton,C#,Inheritance,Singleton,我试图创建一个基类,所有派生类之间共享一些功能。所有派生类都应该是单例。下面是一个伪示例 class ExtensionSettings { public string GetConfigHtml() { // creat conifig html for all properties } public void SaveSettings() { // save stuff } } class SettingsA

我试图创建一个基类,所有派生类之间共享一些功能。所有派生类都应该是单例。下面是一个伪示例

class ExtensionSettings
{
    public string GetConfigHtml()
    {
        // creat conifig html for all properties
    }

    public void SaveSettings()
    {
        // save stuff
    }
}

class SettingsA : ExtensionSettings
{
    private static SettingsA instance;
    public static SettingsA Instance {get {return instance ?? (instance = new SettingsA());}}

    public string setting1{get;set;}
    public string setting2{get;set;}
}

class SettingsB : ExtensionSettings
{
    private static SettingsB instance;
    public static SettingsB Instance {get {return instance ?? (instance = new SettingsB());}}

    public string setting1{get;set;}
    public string setting2{get;set;}
}


static void Main(string[] args)
{
    System.Console.WriteLine(SettingsA.Instance.setting1);
    System.Console.WriteLine(SettingsB.Instance.setting2);
}

是否可以将实例化部分移动到ExtensionSettings基类?

基类不知道要实例化的对象的其余部分。 基本上,当您从基类派生时,会在派生类中添加额外的逻辑 对基类隐藏。因此,在基类中进行实例化并不重要
有可能。

不,这样做没有意义。你想完成什么?为什么派生类必须是单实例?单实例不能从多个线程安全使用。与编写仅使用新实例初始化字段的多线程安全工作的解决方案相比,执行您正在做的工作(效率更低)。它的代码太少了,我不明白为什么要尝试在基类中实现它,即使可以。这是一个单一的,非常简短和简单。要编写的代码行。@AlexM我正在尝试创建一种轻松构建html设置的方法。ExtensionSettings基类中的GetConfigHtml()函数使用反射来循环类的属性并构建适当的HTML。这就是为什么我有一个派生类的实例。但我不想每次需要访问属性时都创建SettingsA的新实例。这就是为什么我将其设置为单例。@PatrickNijhuis,为什么不使用构造函数创建基类,该构造函数将调用类作为参数和/或调用类对象实例。然后可以在基类中循环子类的属性以获取值。我不知道我是否理解正确。