¿Permitir que una clase se pase a sí mismo como un parámetro a una clase base genérica es malo?

La primera vez que vi a un colega hizo esto cuando implementó grupos de objetos. Pasó la clase que se iba a agrupar como un parámetro a una clase base genérica. Esta clase base trazó el código de agrupación.

Lo extraño es que la clase base sabrá de sus hijos. Esto se considera una mala práctica en todos los casos normales. Pero en este caso, el padre es solo una solución técnica para evitar escribir código repetitivo. La clase base nunca es referenciada por ningún otro código.

Un inconveniente de esta construcción es que "quema la clase base". No puede introducir la clase base genérica en medio de una jerarquía. Este problema puede estar fuera del tema.

A continuación se muestra un ejemplo pensable:

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>
{
}

Código mejorado:

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>
{
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta