Конструктор может возвратить SubClass?

Учитывая следующий клиентский код:

var obj = new Class1();

Там какой-либо путь состоит в том, чтобы изменить конструктора Class1 так, чтобы он на самом деле возвратил подкласс (или некоторая другая альтернативная реализация) вместо этого?

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

Я предполагаю, что ответ не, но интересно, существует ли некоторый умный способ заставить это произойти.

9
задан John Saunders 27 August 2014 в 00:49
поделиться

3 ответа

Для подобных вещей вы можете проверить шаблон Factory. Кроме того, в зависимости от ваших потребностей, я бы рекомендовал взглянуть на общие методы уменьшения сцепления. Ваш вызов конструктора класса - это самая сложная связь, которую вы можете иметь в программе, и, как вы сами выяснили, делает такие вещи, как замена реализации, затруднительной.

Прочтите про «Инверсию управления» и «Внедрение зависимостей», может быть, это то, что вы действительно ищете.

Хорошую библиотеку можно найти здесь .

0
ответ дан 4 December 2019 в 15:14
поделиться

Вы можете заменить конструктор фабричным методом, и возвращать все, что хотите, в зависимости от параметров:

public Class2 : Class1 {}

public static Class1 CreateClass1(bool returnDerivedClass)
{
    if (returnDerivedClass)
    {
        return new Class2();
    }
    else
    {
        return new Class1();
    }
}
9
ответ дан 4 December 2019 в 15:14
поделиться

Это невозможно.

Умные обходные пути включают замену конструктора на статическую функцию или (не рекомендуется) использование обертки вокруг базового класса и создание различных обернутых классов.

4
ответ дан 4 December 2019 в 15:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: