我如何实现可以从 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;
前段时间我了解到 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;