前段时间我学会了Singleton实现,它只允许类对象的单个实例,方法是隐藏类初始值并在对象内部使用对象的私有静态引用,以及引用该私有引用的公共GETTER - < / p>
public class Foo : IDisposable{
private static Foo _Instance;
public static Foo Instance{ get{ return Foo._Instance ?? new Foo(); }
private Foo(){ Foo._Instance = this; }
public void Dispose(){ Foo._Instance = null; }
}
我非常喜欢这个 - 对于我希望可以在应用程序范围内访问的窗口来说,它特别好。
我真正想要的一件事是能够实现一个通用的Singleton Window类,在该类上可以构建一个真实的窗口然后像这样访问 - 这可能吗?我的想法就像 -
public class SingletonWindow : Window {
private static SingletonWindow _Instance;
public static SingletonWindow Instance{ get{ return SingletonWindow._Instance ?? new SingletonWindow(); } }
private SingletonWindow(){ SingletonWindow._Instance = this; }
private sealed override void OnClosed(EventArgs E){ SingletonWindow._Instance = null; }
}
但......我内心深处的一些事情,我能说得很有声音告诉我,这绝对会非常失败。有人可以告诉我为什么会失败(如果,确实会失败),如果有可能实现我在这里尝试实现的目标,以及如果可能的话我该如何去做?
答案 0 :(得分:2)
就个人而言,我不是单身人士的粉丝。 也就是说,如果你想要一个泛型类,那就把它变成一个泛型类吧。您必须在派生类上有一个静态构造函数,它将为您的泛型类提供私有构造函数的路径,但这就是它。
public abstract class Singleton<T> where T : Window, Singleton<T>
{
protected static Func<T> create;
private static T instance;
public static T Instance { get { return instance ?? (instance = create()); } }
private sealed override void OnClosed(EventArgs e)
{
instance = null;
}
}
public class MyWindow : Singleton<MyWindow>
{
static MyWindow()
{
create = () => new MyWindow();
}
private MyWindow() { }
}
然后,您可以访问派生类上的实例,就像它是普通的单例一样。
var myWindow = MyWindow.Instance;