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

How can I implement a Singleton class that can be derived from in WPF?

前段时间我了解到 Singleton 实现仅允许 class 对象的单个实例,方法是隐藏 class 初始化器并在自身内部使用对象的私有静态引用,并且引用该私有引用的 public GETTER -

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; }
}

我非常喜欢这个 - 它对 windows 特别好,我希望应用程序范围广泛。

我真正想要的一件事是能够实现一种通用的 Singleton Window class,可以在其上构建真正的 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; }
}

但是...我内心深处有一些我无法完全表达出来的东西告诉我,这绝对会悲惨地失败。有人可以告诉我为什么这会失败(如果,确实会失败),如果有可能实现我在这里试图实现的目标,以及如果可能的话我将如何去做?

就个人而言,我不是单身人士的粉丝。 也就是说,如果您想要通用 class,请将其设为通用 class。您将必须在派生的 class 上有一个静态构造函数,它将提供通往通用 class 的私有构造函数的路径,但仅此而已。

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() { }
}

然后您可以访问派生 class 上的实例,就好像它是一个普通的单例一样。

var myWindow = MyWindow.Instance;