我正在开发一个我正在使用插件系统的应用程序。为了提供对配置屏幕的统一访问,我为每个插件添加了一个必须实现设置界面的设置类。此外,每个Settings类都应实现单例模式,如下所示:
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
}
是否可以在界面中实现单例模式?
任何帮助表示感谢 - 提前致谢!
答案 0 :(得分:11)
您可以选择使用抽象类而不是接口,并在基本抽象类中实现单例。
您可以使用泛型来创建继承类类型的单例实例。
答案 1 :(得分:6)
抱歉没有。接口没有实现。
答案 2 :(得分:1)
您可以使用Generic界面,例如:
public interface Singleton<T>
{
T Instance { get; }
}
答案 3 :(得分:1)
您不能通过界面强制执行,因为如果您有一个类似的界面:
public interface ISingleton
{
ISingleton GetInstance();
}
首先,接口只覆盖实例方法,而不是静态,这就是你想要的单例模式。其次,没有什么可以强制GetInstance
返回单身人士;它可以,但它也可以每次返回一个新对象,一个池化对象,等等。
这是合理的,单例是一种实现模式,不仅仅是一个整体设计模式(在大多数情况下它通常被认为是反模式的一个原因),因此拥有一个接口(在一般意义上)没什么价值承诺一个实现,更好的是让接口(在一般意义上)承诺返回一个可用的实例,并将实现留给相关的类。
答案 4 :(得分:0)
您可以按如下方式扩展您的界面:
public interface IPluginSettings
{
IPluginSettings Instance
{
get;
}
}
并在具体的PluginSettings类中实现get
方法的一些逻辑。
答案 5 :(得分:0)
看起来你最好有一个工厂来构建实现接口的东西(Singleton)
<强>已更新强>
您可以像使用Ninject一样使用IoC并将接口绑定到常量。尝试:
Bind<IPluginSettings>().ToConstant(PluginSettings);
答案 6 :(得分:-1)
我没有尝试过,也许你可以创建一个像
这样的界面public interface ISingleton<T>
{
T Instance
{
get;
}
}
通用单例类
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();
}
}
然后
public class xxx: ISingleton<xxx>{
public Singleton<xxx> Instance...
}