Está deixando uma classe passar por si mesma como um parâmetro para uma classe base genérica?

Eu vi pela primeira vez um colega fazer isso quando ele implementou pools de objetos. Ele passou a classe que seria agrupada como um parâmetro para uma classe base genérica. Esta classe base apresentou o código de pooling.

O estranho é que a classe base saberá de seus filhos. Isso é considerado uma prática ruim em todos os casos normais. Mas neste caso o pai é apenas uma solução técnica para evitar escrever código repetitivo. A classe base nunca é referenciada por nenhum outro código.

Uma desvantagem dessa construção é que ela "queima a classe base". Você não pode introduzir a classe base genérica no meio de uma hierarquia. Esse problema pode estar fora do tópico.

Abaixo está um exemplo pensável:

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 aprimorado:

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

questionAnswers(2)

yourAnswerToTheQuestion