我第一次看到一位同事在执行对象池时做这件事。他将这个类作为参数传递给泛型基类。这个基类放出了合并代码。是否让类将自身作为参数传递给泛型基类邪恶?
奇怪的是,基类会知道它的孩子。这在每个正常情况下被认为是不好的做法。但在这种情况下,父母只是避免编写重复代码的技术解决方案。基类不会被任何其他代码引用。
这种结构的一个缺点是它“烧伤基础类”。您不能在层次结构中引入泛型基类。这个问题可能超出了这个话题。
下面是一个可以想到例如:
public abstract class Singleton<T> where T : class
{
public static T Instance { get; private set; }
public Singleton()
{
if (Instance != null)
throw new Exception("Singleton instance already created.");
Instance = (T) (object) this;
}
}
public class MyClass : Singleton<MyClass>
{
}
改进代码:
public abstract class Singleton<T> where T : Singleton<T>
{
public static T Instance { get; private set; }
public Singleton()
{
if (Instance != null)
throw new Exception("Singleton instance already created.");
Instance = (T) this;
}
}
public class MyClass : Singleton<MyClass>
{
}
你最后一句话让我心动。 class SingleTon where T:Singleton ?这不需要你无限递归(每个T必须是Singleton ,其中T将再次是单例等) –
Kristof
增加了SLaks代码改进。第一行确实让你头晕目眩。 –
@Kristof参见上面的例子:'public MyClass:Singleton'。这种类型,“MyClass”IS-A'Singleton '所以它的工作原理。尽管如此,它仍然有点脑筋急转弯。 –