Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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#-是否可以使用接口实现单例模式?_C#_Design Patterns_Interface_Singleton - Fatal编程技术网

C#-是否可以使用接口实现单例模式?

C#-是否可以使用接口实现单例模式?,c#,design-patterns,interface,singleton,C#,Design Patterns,Interface,Singleton,我目前正在开发一个应用程序,其中我使用了一个插件系统。为了提供对配置屏幕的统一访问,我为每个插件添加了一个设置类,它必须实现一个设置接口。此外,每个设置类都应实现singleton模式,如下所示: public sealed class PluginSettings : IPluginSettings { private static readonly PluginSettings instance = new PluginSettings(); private PluginS

我目前正在开发一个应用程序,其中我使用了一个插件系统。为了提供对配置屏幕的统一访问,我为每个插件添加了一个设置类,它必须实现一个设置接口。此外,每个设置类都应实现singleton模式,如下所示:

public sealed class PluginSettings : IPluginSettings
{

    private static readonly PluginSettings instance = new PluginSettings();
    private PluginSettings () { }

    public static PluginSettings Instance
    {
        get
        {
            return instance;
        }
    }

    # region interface implementation
    # ...
    # endregion

}
是否可以在接口中实现单例模式


感谢您的帮助-提前感谢

抱歉,没有。接口没有实现

您可以选择使用抽象类而不是接口,并在基本抽象类中实现单例


您可以使用泛型生成继承类类型的单例实例。

您可以使用泛型接口,例如:

public interface Singleton<T> 
{
    T Instance { get; }
}
公共接口单例
{
T实例{get;}
}

您可以按如下方式扩展界面:

public interface IPluginSettings
{
    IPluginSettings Instance
    {
        get;
    }
}

在具体的PluginSettings类中,实现
get
方法的一些逻辑。

似乎您最好有一个工厂来构造实现接口的东西(单例)。
更新
您可以像Ninject一样使用IoC并将接口绑定到常量。尝试:

Bind<IPluginSettings>().ToConstant(PluginSettings);
Bind().ToConstant(插件设置);

我还没有尝试过,也许你可以创建一个像

public interface ISingleton<T>
{
    T Instance
    {
        get;
    }
}
公共接口为单体
{
T实例
{
得到;
}
}
泛型单例类

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

        public static T Instance
        {
            get { return SingletonCreator.instance; }
        }

        class SingletonCreator
        {
            static SingletonCreator() { }

            internal static readonly T instance = new T();
        }
}
公共类单例,其中T:new(){
Singleton(){}
公共静态T实例
{
获取{return SingletonCreator.instance;}
}
类单音创建者
{
静态SingletonCreator(){}
内部静态只读T实例=新T();
}
}
然后

public class xxx: ISingleton<xxx>{
     public Singleton<xxx> Instance...
}
公共类xxx:ISingleton{
公共单例实例。。。
}

您不能通过接口强制执行它,因为如果您有如下接口:

public interface ISingleton
{
  ISingleton GetInstance();
}
首先,该接口只包含实例方法,而不是静态的,这正是singleton模式所需要的。其次,没有强制执行
GetInstance
返回单例;它可以,但也可以每次返回一个新对象,一个池对象,等等


这是合理的,singleton是一种实现模式,而不是一种总体设计模式(这是为什么在大多数情况下它经常被视为反模式的一个原因),因此让一个接口(一般意义上)承诺一个实现没有什么价值,让接口(同样,一般意义上)更好承诺返回一个可用的实例,并将实现留给有问题的类。

Hum,这似乎不起作用,因为为singleton模式定义的“实例”字段是静态的。知道如何解决这个问题吗?接口的静态实现不匹配,它必须作为实例方法实现,这意味着只有拥有一个实例才能获得一个实例。但是,只有拥有一个PluginSettings,才能获得PluginSettings,你不能得到,因为你还没有一个插件。我会这样尝试-所有这些解决方案似乎要么太大,要么不适合我的问题。必须继续学习…;-)