Учитывая следующий клиентский код:
var obj = new Class1();
Там какой-либо путь состоит в том, чтобы изменить конструктора Class1 так, чтобы он на самом деле возвратил подкласс (или некоторая другая альтернативная реализация) вместо этого?
Я хотел бы, чтобы obj получил одну из двух различных реализаций, в зависимости от некоторого условия. Очевидно, я мог измениться на использование фабрики или платформы DI, но я хотел бы постараться не изменять клиентский код, если это возможно.
Я предполагаю, что ответ не, но интересно, существует ли некоторый умный способ заставить это произойти.
Для подобных вещей вы можете проверить шаблон Factory. Кроме того, в зависимости от ваших потребностей, я бы рекомендовал взглянуть на общие методы уменьшения сцепления. Ваш вызов конструктора класса - это самая сложная связь, которую вы можете иметь в программе, и, как вы сами выяснили, делает такие вещи, как замена реализации, затруднительной.
Прочтите про «Инверсию управления» и «Внедрение зависимостей», может быть, это то, что вы действительно ищете.
Хорошую библиотеку можно найти здесь .
Вы можете заменить конструктор фабричным методом, и возвращать все, что хотите, в зависимости от параметров:
public Class2 : Class1 {}
public static Class1 CreateClass1(bool returnDerivedClass)
{
if (returnDerivedClass)
{
return new Class2();
}
else
{
return new Class1();
}
}
Это невозможно.
Умные обходные пути включают замену конструктора на статическую
функцию или (не рекомендуется) использование обертки вокруг базового класса и создание различных обернутых классов.