Я впервые увидел, что коллега это сделал, когда он реализовал пулы объектов. Он прошел класс, который собирался объединяться как параметр в общий базовый класс. Этот базовый класс заложил код объединения.
Странно, что базовый класс узнает о своих детях. Это считается плохой практикой в каждом нормальном случае. Но в этом случае родитель - это просто техническое решение, чтобы избежать написания повторяющегося кода. Базовый класс никогда не ссылается ни на какой другой код.
Одним из недостатков этой конструкции является то, что она "сжигает базовый класс". Вы не можете ввести общий базовый класс в середине иерархии. Эта проблема может быть вне темы.
Ниже приведен мыслящий пример:
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>
{
}