在一个基本表单中可以访问多个“应用程序”

时间:2009-05-21 11:17:42

标签: .net winforms

我有两个基本上独立的应用程序,用于配置该公司销售的两个硬件。

我被要求将两个应用程序放在一起,以便可以从同一程序中访问它们,以便两者都可以访问。这个想法的类比是打开程序,选择要打开的文件,然后打开文档编辑器或电子表格编辑器,具体取决于文件的类型。

对于应用程序的大多数方面来说,这并不是特别困难,但我的问题主要来自整合应用程序的主工具栏。两个不同的应用程序中的每一个都有自己的一组功能,这些功能与一组通用按钮有关,并且有一组自己的按钮。

我可以将代码中的按钮响应与typechecking分开,即

If documentOpened.isSpreadsheet
  spreadSheetFunction()
Else
  documentFunction()

但这对我来说似乎很混乱,将两个类的功能合并到一个膨胀的接口类中。

有没有办法实现更大程度的封装,这里,假设两个接口是如此不同?

2 个答案:

答案 0 :(得分:1)

我不知道.Net,所以这是一般的面向对象编程建议。但是,您看起来像是在询问一般的OO设计问题。

看起来你正试图做double dispatch;也就是说,根据两种不同的运行时类型选择实际执行的代码。

完成双重调度的传统clean-OO方法是使用visitor pattern。不要被名称或描述模式的例子所迷惑,以便走一些包含结构的模式;即使你一次只有一个物体,它也非常有用!

基本上,你要做的是定义一些接口 - CommonButtonHandler - 然后有一个电子表格和文档的实现。单击常用的“旋转”按钮时,您可以:

// Inside CommonTwiddleButton.onClick()
currentCommonButtonHandler.twiddleButtonClicked()

在线使用访问者模式进行双重调度有一些很好的例子;只是一定要搜索这两个术语,否则你最终会得到一堆访客模式示例,假设你需要走一些异构集合或一堆lisp weenies吹嘘他们的对象系统如何进行多次调度默认情况下。

答案 1 :(得分:1)

让人想起的是访客设计模式(虽然它可能不是最严格意义上的)。如果您定义了一个包含工具栏上所有按钮的接口,然后为每个文档类型实现了一个类,这可以像Daniel建议的那样正常工作。大纲代码将是

public interface IToolbarHandler {
  void ButtonOne;
  void ButtonTwo;
  //etc
}

public class SpreadsheetToolbarHandler : IToolbarHandler {
   public void ButtonOne {
      //Do Some action
   }
   public void ButtonTwo {
      //Do Some action
   }
}

public class DocumentToolbarHandler : IToolbarHandler {
   public void ButtonOne {
      //Do Some action
   }
   public void ButtonTwo {
      //Do Some action
   }
}

然后只需要一个表单级别变量,它是IToolbarHandler类型,并设置为当前正在查看的文档的相关处理程序的实例。然后,工具栏事件处理程序只需调用该变量的相关方法。