设计问题:将特定处理应用于仅操纵超类的子类

时间:2013-10-30 17:16:31

标签: c++ design-patterns architecture

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

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

我一直在考虑命令模式和startegy模式,但我认为它们并不适合。

你有什么建议吗? 谢谢

1 个答案:

答案 0 :(得分:1)

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

执行此操作的一种方法是将虚拟成员函数添加到返回相关操作的基本窗口小部件类型。然后,将选项卡窗口小部件返回的QWidget强制转换为基本窗口小部件类型。这仍然涉及强制转换(因为QTabWidget不适合返回基本窗口小部件类型的窗口小部件),但是当您添加新类型的窗口小部件时它会消除可维护性问题。