Надеюсь, это не совсем тривиально и очевидно.
У меня есть несколько похожих программ, над которыми я работаю. В каждой программе мне нужно реализовать будущее о сохранении проектов. Я пришел со следующим дизайном:
Project
-- Program1Project
-- Program2Project
Базовый класс проекта:
class Project
{
public:
void NewProject();
void SaveProejct();
void OpenProject();
protected:
virtual void New();
virtual void Save();
virtual void Open();
};
Виртуальные функции переопределяются в производных классах, потому что только конкретная программа знает, как (какие объекты сохранить на диск) реально сохранить проект.
Также часть сохранения нового или открытия проекта показывает диалоговое окно SaveAs / Open, из которого пользователь выбирает, где сохранить / открыть проект.
Например, NewProject () реализован в терминах метода New:
void Project::NewProject()
{
1. // Show dialog for whether to save existing project
2. // check whether the project was already saved
3. // if yes, only overwrite the existing project
4. // if no, show SaveAs Dialog
5. // ...
6. this->New();
}
Строки с 1 по 5 - это код, который нужен всем моим программам, т. Е. Последовательность и порядок создания диалогов и проверки одинаковы.
Я думал о том, следует ли размещать реальный код, который создает диалоги, в методах Project :: New и Project :: Open. Подумав, я решил, что это не очень хорошее решение, потому что класс Project является классом модели, а класс модели не должен создавать GUI. Итак, я подумал, что, возможно, лучшее место для написания кода из строки 1 в строку 5 - это обработчики событий кнопок «Сохранить / Открыть» конкретной программы. Но это означает, что мне придется дублировать его для каждой программы.
Итак, вопрос в том, как мне отделить создание диалогов, которые будут одинаковыми для всех моих программ, от фактического сохранения / открытия проектов таким образом, чтобы не требовалось дублирование кода?