Позволяет ли класс передавать себя в качестве параметра родовому базовому классу злу?

Я впервые увидел, как коллега сделал это, когда он реализовал пулы объектов. Он передал класс, который собирался объединить в качестве параметра, в базовый базовый класс. Этот базовый класс выложил код пула.

Странно, что базовый класс узнает о своих детях. Это считается плохой практикой в каждом нормальном случае. Но в этом случае родитель - это просто техническое решение, позволяющее избежать написания повторяющегося кода. На базовый класс никогда не ссылается ни один другой код.

Недостатком этой конструкции является то, что она «сжигает базовый класс». Вы не можете ввести базовый базовый класс в середине иерархии. Эта проблема может быть за пределами темы.

Ниже приведен мыслимый пример:

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

Ответы на вопрос(2)

Ваш ответ на вопрос