设计问题:仅对子类应用特定处理,仅操作超类

Design issue: apply specific treatment to a subclass only manipulating the superclass

本文关键字:处理 超类 操作 子类 问题 应用      更新时间:2023-10-16

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

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

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

你有什么建议吗?谢谢

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

执行此操作的一种方法是将虚拟成员函数添加到返回相关操作的基本小部件类型中。然后,将选项卡小组件返回的 QWidget 转换为基本小组件类型。这仍然涉及强制转换(因为QTabWidget没有准备好返回基本小部件类型的小部件),但是当您添加新类型的小部件时,它摆脱了可维护性问题。