オブジェクト プールを実装したときに、同僚がこれを行うのを初めて見ました。彼は、プールされる予定のクラスをパラメーターとしてジェネリック基本クラスに渡しました。この基本クラスは、プーリング コードをレイアウトしました。
奇妙なことに、基本クラスはその子を認識します。これは、すべての通常のケースで悪い習慣と見なされます。ただし、この場合、親は反復的なコードの記述を避けるための技術的なソリューションにすぎません。基本クラスは、他のコードによって参照されることはありません。
この構造の欠点の 1 つは、「基底クラスを焼き尽くす」ことです。階層の途中にジェネリック基本クラスを導入することはできません。この問題はトピックの外にある可能性があります。
以下は考えられる例です。
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>
{
}