これが非常に些細で明白なことではないことを願っています。
私が取り組んでいる同様のプログラムがいくつかあります。各プログラムでは、プロジェクトの保存について将来を実装する必要があります。私は次のデザインで来ました:
Project
-- Program1Project
-- Program2Project
基本クラス Project :
class Project
{
public:
void NewProject();
void SaveProejct();
void OpenProject();
protected:
virtual void New();
virtual void Save();
virtual void 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 行目までのコードを記述するのに最適な場所は、特定のプログラムの保存/開くボタンのイベント ハンドラーであると考えていました。しかし、それは、プログラムごとに複製する必要があることを意味します。
問題は、すべてのプログラムで同じになるダイアログの作成を、コードの複製を必要としない方法でプロジェクトを実際に保存/開くことからどのように分離する必要があるかということです。