设计问题:仅对超类进行操作的子类应用特定处理
Posted
技术标签:
【中文标题】设计问题:仅对超类进行操作的子类应用特定处理【英文标题】:Design issue: apply specific treatment to a subclass only manipulating the superclass 【发布时间】:2013-10-30 17:16:30 【问题描述】:我在一个项目中工作,我遇到了一个我不知道如何解决的设计问题。我想找到代码可扩展性的最佳解决方案。 该项目包含一个带有标签的网络浏览器,但在标签中不仅有网页,我还可以有其他类型的小部件。 我正在使用 Qt,因此选项卡中的小部件是 QWidgets(QWebview 和我仍然需要自己编写代码的其他类型)。无论如何,我会尽量保持这个问题足够通用。
有一个类 QWidget,它继承了两个类:QWebView 和 MyWidget。 我有一个可以包含它们的容器(QTabWidget),因为它可以包含 QWidget。 此外,我有一个按钮(例如上一页按钮),它只适用于一种 QWidget:QWebView。 所以,当我按下这个按钮时,我向 QTabWidget 询问当前的 QWidget,如果它是 QWebView,我会做一些事情,否则我什么都不做。 这就是问题所在:我需要能够区分两种不同的类型:如果我让 QTabWidget 给我 currentWidget,它会给我一个 QWidget*,但我不知道它是 QWwbView 还是 MyWidget 和所以我必须做讨厌的 dynamic_cast 来检查真实的类型。 这意味着如果我用另一个动作添加一个新的 MyWidget2,我将不得不更新我所有有 dynamic_cast 的代码,我不希望这样。
我一直在考虑命令模式和策略模式,但我认为它们不太适用。
你有什么建议吗? 谢谢
【问题讨论】:
【参考方案1】:在抽象层面上,听起来您需要某种方式将各种小部件类型映射到它们可以支持的操作(例如“转到上一页”) - 这样,当您添加新的小部件类型时,您也指定它的动作。根据当前查看的选项卡,您可以启用/禁用相关操作,这样当用户能够执行某项操作时,您就知道它适用于当前正在查看的选项卡类型。
这样做的一种方法是向您的基本小部件类型添加一个虚拟成员函数,该函数返回相关操作。然后,您将选项卡小部件返回的QWidget
s 转换为您的基本小部件类型。这仍然涉及强制转换(因为QTabWidget
没有准备好返回您的基本小部件类型的小部件),但是当您添加新类型的小部件时,它消除了可维护性问题。
【讨论】:
谢谢。但是你是我没有得到的东西:我的超类中的虚函数如何返回相关动作?是数据结构吗?我不明白,对不起。 @excalibur1491:我正在设想制作一个数据结构来表示操作,为每种小部件类型返回一组此类操作,然后在切换时使用当前小部件的操作来更新您的按钮集小部件之间。我承认我并没有把它固定在这之外——它需要充实一点。以上是关于设计问题:仅对超类进行操作的子类应用特定处理的主要内容,如果未能解决你的问题,请参考以下文章