Ist es böse, eine Klasse sich selbst als Parameter an eine generische Basisklasse übergeben zu lassen?

Das habe ich zum ersten Mal bei einem Kollegen gesehen, als er Objektpools implementiert hat. Er übergab die Klasse, die als Parameter gepoolt werden sollte, an eine generische Basisklasse. Diese Basisklasse legte den Pooling-Code fest.

Das Seltsame ist, dass die Basisklasse von ihren Kindern weiß. Dies wird in jedem normalen Fall als schlechte Praxis angesehen. In diesem Fall ist das übergeordnete Element jedoch nur eine technische Lösung, um zu vermeiden, dass sich wiederholender Code geschrieben wird. Die Basisklasse wird von keinem anderen Code referenziert.

Ein Nachteil dieser Konstruktion ist, dass sie "die Basisklasse verbrennt". Sie können die generische Basisklasse nicht mitten in einer Hierarchie einführen. Dieses Problem liegt möglicherweise außerhalb des Themas.

Unten ist ein denkbares Beispiel:

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

Verbesserter Code:

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

Antworten auf die Frage(2)

Ihre Antwort auf die Frage