"Заменить условный на полиморфизм" является изящным только тогда, когда тип объекта, который вы делаете для оператора switch/if, уже выбран для вас. В качестве примера у меня есть веб-приложение, которое считывает параметр строки запроса под названием "действие". Действие может иметь значения "просмотра", "редактирования", "сортировки" и т.д. Итак, как мне реализовать это с полиморфизмом? Ну, я могу создать абстрактный класс под названием BaseAction и получить из него ViewAction, EditAction и SortAction. Но разве мне не нужно условие, чтобы решить, какой аромат типа BaseAction нужно создать? Я не вижу, как вы можете полностью заменить условности полиморфизмом. Во всяком случае, условные выражения просто подталкиваются к вершине цепочки.
EDIT:
public abstract class BaseAction
{
public abstract void doSomething();
}
public class ViewAction : BaseAction
{
public override void doSomething() { // perform a view action here... }
}
public class EditAction : BaseAction
{
public override void doSomething() { // perform an edit action here... }
}
public class SortAction : BaseAction
{
public override void doSomething() { // perform a sort action here... }
}
string action = "view"; // suppose user can pass either "view", "edit", or "sort" strings to you.
BaseAction theAction = null;
switch (action)
{
case "view":
theAction = new ViewAction();
break;
case "edit":
theAction = new EditAction();
break;
case "sort":
theAction = new SortAction();
break;
}
theAction.doSomething(); // So I don't need conditionals here, but I still need it to decide which BaseAction type to instantiate first. There no way to completely get rid of the conditionals.