2013-10-30 33 views
1

我正在一个项目中工作,我有一个设计问题,我不知道如何解决。我想找到代码可扩展性的最佳解决方案。 该项目包含一个带有选项卡的Web浏览器,但在选项卡中不仅有网页,还可以有其他类型的窗口小部件。 我正在使用Qt,因此选项卡中的小部件是QWidgets(QWebview和其他类型,我仍然需要自己编码)。无论如何,我会尽量保持这个问题的通用性。设计问题:将特定处理应用于子类只操作超类

有两个类继承的类QWidget:QWebView和MyWidget。 我有一个容器(QTabWidget),可以包含它们两个,因为它可以包含QWidgets。 此外,我有一个按钮(例如上一页按钮),它只适用于一种QWidget:QWebView。 所以,当我按下这个按钮时,我会问QTabWidget当前的QWidget,如果它的QWebView我做了什么,否则我什么也没做。 这就是问题所在:我需要能够区分两种不同的类型:如果我要求QTabWidget向我提供currentWidget,它会给我一个QWidget *,但我不知道它是一个QWwbView还是一个MyWidget所以我必须做一个讨厌的dynamic_cast <>来检查真实的类型。 这意味着如果我添加一个新的MyWidget2与另一个动作,我将不得不更新所有我的代码dynamic_cast <>,我不想这样做。

我一直在考虑命令模式和startegy模式,但我不认为它们真的很好。

你有什么建议吗? 谢谢

回答

1

在抽象层面上,听起来好像你需要某种方法将各种控件类型映射到它们可以支持的动作(例如“转到上一页”) - 这样,当你添加一个新的控件类型,您也可以指定其操作。根据当前查看的选项卡,您可以启用/禁用相关操作,以便当用户能够执行某个操作时,您知道它将适用于当前正在查看的选项卡类型。

这样做的一种方法是将虚拟成员函数添加到您的基本窗口小部件类型中,以返回相关操作。然后,您将由选项卡小部件返回的QWidget转换为您的基本小部件类型。这仍然涉及一个演员(因为QTabWidget不适合返回基本小部件类型的小部件),但是当您添加新类型的小部件时,它将摆脱可维护性问题。

+0

谢谢。但你是我没有得到的:我的超类的虚函数是如何返回相关的行为的?它是一个数据结构?我不明白,对不起。 – ddeunagomez

+0

@ excalibur1491:我正在设想制作一个数据结构来表示动作,为每个控件类型返回一组这样的动作,然后使用当前控件的动作在切换控件时更新一组按钮。我承认我并没有把它压在那里 - 它需要充实一点。 –