派生静态成员

Mik*_*all 3 c# oop design-patterns

我有一个具有私有静态成员的基类:

class Base
{
    private static Base m_instance = new Base();
    public static Base Instance
    {
        get { return m_instance; }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想从中派生出多个类:

class DerivedA : Base {}
class DerivedB : Base {}
class DerivedC : Base {}
Run Code Online (Sandbox Code Playgroud)

但是,此时调用DerivedA :: Instance将返回与DerivedB :: Instance和DerivedC :: Instance相同的确切对象.我可以通过在派生类中声明实例来解决这个问题,但是然后每个派生类都需要这样做,而且看起来它应该是不必要的.那么有什么方法可以将所有这些放在基类中吗?可以应用设计模式吗?

Jon*_*eet 11

有一种非常狡猾的方式:

class Base
{
     // Put common stuff in here...
}

class Base<T> : Base where T : Base<T>, new()
{
    private static T m_instance = new T();

    public static T Instance { get { return m_instance; } }
}

class DerivedA : Base<DerivedA> {}
class DerivedB : Base<DerivedB> {}
class DerivedC : Base<DerivedC> {}
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为每个构造类型有一个静态变量- 例如,它List<string>是一个不同的类型List<int>,因此会有单独的静态变量.

我也把它作为派生类的一个实例 - 我不知道这是不是你想要的,但我想我至少可以让它为你服务:)

但总的来说,这是一件令人讨厌的事情.静态变量并不是真正为这种用途而设计的 - 我只是滥用了泛型的特性来获得你所要求的"某种"行为.

另请注意,Base<DerivedA>.Instance将返回相同的结果DerivedA.Instance- 属性/变量不"知道"您正在使用的结果DerivedA.Instance.我不知道这对你来说是否重要.

使用额外的非泛型类,您可以编写:

Base t = DerivedA.Instance;
t = DerivedB.Instance;
Run Code Online (Sandbox Code Playgroud)

如果您不需要,请把它拿出来:)


Meh*_*ari 6

静态方法不支持多态,因此,这样的事情是不可能的.

从根本上说,Instance属性不知道你是如何使用它的.并且它的单个实现将存在,因为它是静态的.如果你真的想这样做,这个"不推荐"的解决方案是可用的(我从Jon的解决方案中得到了想法):

private static Dictionary<Type, Base> instances = new Dictionary<Type, Base>();
public static T GetInstance<T>() where T : Base, new() {
  Type ty = typeof(T);
  T x;
  if (instances.TryGetValue(ty, out x)) return x;
  x = new T();
  instances[ty] = x;
  return x;
}
Run Code Online (Sandbox Code Playgroud)