Заменить условное выражение полиморфизмом - хорошо в теории, но не практично

«Заменить условное выражение на полиморфизм» элегантно только тогда, когда тип объекта, для которого вы выполняете оператор switch / if, уже выбран для вас. В качестве примера у меня есть веб-приложение, которое считывает параметр строки запроса под названием «действие». Действие может иметь значения «просмотр», «редактирование», «сортировка» и т. Д. Итак, как мне реализовать это с помощью полиморфизма? Что ж, я могу создать абстрактный класс под названием BaseAction и унаследовать от него ViewAction, EditAction и SortAction. Но не надо t Мне нужно условное выражение, чтобы решить, какой вариант типа BaseAction создавать? Я не понимаю, как можно полностью заменить условные выражения полиморфизмом. Во всяком случае, условные выражения просто подталкиваются к началу цепочки.

РЕДАКТИРОВАТЬ:

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's no way to completely get rid of the conditionals.
26
задан thkala 1 February 2011 в 20:19
поделиться