我第一次看到一位同事在執行對象池時做這件事。他將這個類作爲參數傳遞給泛型基類。這個基類放出了合併代碼。是否讓類將自身作爲參數傳遞給泛型基類邪惡?
奇怪的是,基類會知道它的孩子。這在每個正常情況下被認爲是不好的做法。但在這種情況下,父母只是避免編寫重複代碼的技術解決方案。基類不會被任何其他代碼引用。
這種結構的一個缺點是它「燒傷基礎類」。您不能在層次結構中引入泛型基類。這個問題可能超出了這個話題。
下面是一個可以想到例如:
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 '所以它的工作原理。儘管如此,它仍然有點腦筋急轉彎。 –