ИМО, отправной точкой рефакторинга будут следующие утверждения:
1. m_pos.push_back( MenuPlusIter( m_menu, m_menu->m_items.begin() ) );
2. m_pos.push_back( MenuPlusIter( submenu, submenu->m_items.begin() ) );
Тот факт, что подобные заявления повторяются, ИМО, является признаком необходимости их рефакторинга.
Если бы вы могли включить (1) в метод вашего базового класса, а затем переопределить его в производном классе, чтобы учесть конкретное поведение (2), то вы могли бы просто поместить это в Execute
.
Поправьте меня, если я ошибаюсь: идея состоит в том, что у меню есть пункты, и с каждым элементом связано действие, которое запускается при обнаружении какого-либо события.
Теперь, когда выбранный вами элемент является подменю, действие Execute
имеет значение: активировать подменю (я использую активацию в общем смысле). Когда предмет не является подменю, тогда Execute
- это другой зверь.
У меня нет полного понимания вашей системы меню, но мне кажется, у вас есть своего рода иерархическое меню / подменю (позиции) и некоторые действия, которые запускаются в зависимости от типа узла.
Я предполагаю, что отношение меню / подменю - это иерархия, которая позволяет вам определять листовые узлы (когда у вас нет подменю) и нелистовые узлы (подменю). Конечный узел вызывает действие, а неконечный узел вызывает действие другого типа, которое связано с активацией подменю (это действие восходит к системе меню, поэтому вы не включаете в нее знания о системе меню, вы просто передать действие в систему меню).
Не знаю, имеет ли это для вас смысл.