Переключатель операторов и полиморфизм - PullRequest
0 голосов
/ 09 мая 2018

У меня сейчас проблемы с динамическим полиморфизмом . У меня есть оператор switch, который будет выполнять различные задачи в зависимости от условия:

switch (condition)
{
   case a:
      foo();
      doSomethingA();
   case b:
      foo();
      doSomethingB();
   case c:
      foo();
      doSomethingC();
}

Я хотел создать базовый объект с виртуальным методом, doSomething(), и заставить эту функцию делать BasePtr->doSomething().

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

Это будет только рефакторинг для:

std::unique_ptr<Base> base;
switch (condition)
{
   case a:
      base = std::make_unique<DerivedA>();
   case b:
      base = std::make_unique<DerivedB>();
   case c:
      base = std::make_unique<DerivedC>();
}

base->doSomething();

Это не похоже на полное решение. Этот оператор switch используется только один раз, и вся логика, в зависимости от условий, заканчивается позже. Это решение не будет сжимать дальнейшие операторы switch в базовый переключатель, который указывает, какой объект создать. Что вы думаете о такой проблеме?

1 Ответ

0 голосов
/ 09 мая 2018

Он настолько компактен, насколько вы можете. Вам нужны средства для настройки базы, и в вашем случае вы использовали коммутатор.

Рассмотрим пример ниже ...

Pokemon* pokemon;

switch( mySelection ){
   case 1: pokemon = new Pikachu(); break;
   case 2: pokemon = new Bulbasaur(); break;
   case 3: pokemon = new Charmander(); break;
   default: pokemon = null;
}

if (pokemon!=null)
    pokemon-> specialAttack();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...