1

我希望这不是一件非常微不足道和显而易见的事情。
我正在从事一些类似的程序。在每个程序中,我都必须实施有关保存项目的未来。我带来了以下设计:

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 方法中。经过一番思考,我认为这不是一个好的解决方案,因为项目类是模型类,模型类不应该创建 GUI。所以,我在想,从第 1 行到第 5 行编写代码的最佳位置可能是在特定程序的保存/打开按钮事件处理程序中。但这意味着我将不得不为每个程序复制它。

所以问题是我应该如何将我的所有程序都相同的对话框的创建与不需要复制代码的项目的实际保存/打开分开?

4

2 回答 2

4

GUI 应该引用模型,而不是模型引用 GUI,这几乎可以使模型的联系不受 GUI 的影响。真的没有办法让 GUI 完全不受模型的影响。在某些时候,即使实现隐藏在 GUI 之外,您也会有某种依赖。

于 2010-01-26T14:39:32.347 回答
1

您可以创建一个单独的类,作为模型和视图之间的控制器。例如,控制器可以是项目的成员,您可以在第 1 行调用this->viewController->showDialog(callBackForYes, callBackForNo, callBackForCancel)

viewController 类可以直接回显 gui,或者为不同的 gui 组件使用视图类。

于 2010-01-26T14:40:10.590 回答