如何实现可以从WPF派生的Singleton类?

时间:2015-04-11 18:40:25

标签: c# wpf singleton derived-class

前段时间我学会了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; }
}

但......我内心深处的一些事情,我能说得很有声音告诉我,这绝对会非常失败。有人可以告诉我为什么会失败(如果,确实会失败),如果有可能实现我在这里尝试实现的目标,以及如果可能的话我该如何去做?

1 个答案:

答案 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;