Создайте (абстрактный) интерфейс, общий для всех конфигураций.
Для показанного кода это будет включать Save и OutText, но не Open или Update.
Вывести конфигурации из этого интерфейса
Замените SaveConfiguration1, SaveConfiguration2 на единственную функцию SaveConfiguration, у которой есть дополнительный параметр, позволяющий выбрать правильную конфигурацию для сохранения. Как комментирует Jarod42, этим параметром может быть сама конфигурация (переданная как ссылка на новый общий интерфейс, о котором я упоминал). В противном случае параметром может быть перечисление, которое используется для выбора конфигурации в методе SaveConfiguration.
В любом случае, когда вы достигнете повторяющихся строк Save и OutText, вы будете вызывать их, используя через новый интерфейс и полагаясь на возможности виртуальных функций, чтобы справиться с тем фактом, что различные конфигурации не идентичны, вызывая конкретные версии Save and OutText для вас.
... Редактировать после комментария "У меня уже есть перечисление на 1 уровень выше"
Так что вместо: -
case Options::Configuration1:
{
// your example call doesn't pass a view, but your SaveConfiguration requires one
SaveConfiguration1(/* view? */);
}
Вы могли бы иметь
case Options::Configuration1:
{
// your example call doesn't pass a view, but your SaveConfiguration requires one
SaveConfiguration(/* view? */ , m_Configuration1);
}
Где SaveConfiguration принимает IConfiguration &
void View::SaveConfiguration(std::string path, IConfiguration& config)
{
config.Save(path);
config.OutText(wxFileName::StripExtension(path).ToStdString())
//Enable Reset Menu
wxMenuItem* item2 = GetMenuBar()->FindItem(wxID_RESET);
if (item2 != NULL) item2->Enable(true);
}
class IConfiguration
{
public:
virtual bool Save(const std::string& Output) = 0;
virtual bool OutText(const std::string& BaseFileName) = 0;
// no output or update
}
Вам также необходимо выбрать между перемещением коммутатора в представление, которому принадлежат конфигурации, или предоставлением конфигураций контроллеру.