设计问题:仅对子类应用特定处理,仅操作超类
Design issue: apply specific treatment to a subclass only manipulating the superclass
我正在一个项目中工作,我有一个我不知道如何解决的设计问题。我想找到代码可扩展性的最佳解决方案。该项目由带有选项卡的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
没有准备好返回基本小部件类型的小部件),但是当您添加新类型的小部件时,它摆脱了可维护性问题。
- 模板转换为超类
- 我的超类中的模板问题与结构定义
- C++:处理抽象类中的错误时出现问题
- 如何处理模板类中的复合类型
- 创建子类的多个实例,其中只有一个超类实例
- 给定一个指向对象的超类指针,如何获取对象的大小?
- 重写另一个方法 [C++] 使用的超类回调函数
- static是如何使用ClassA::m_variable处理所有类对象的
- 用初始化列表和超类构造函数声明子类构造函数的正确方式
- 我们可以在没有新实例化的情况下声明一个抽象方法来返回抽象超类中的子类对象吗
- C++为API中定义的结构创建超类
- 使用派生类C++方法的超类
- 在同时处理基类的多个指针时如何处理多态性?
- 确保指向超类的指针指向c++中某个子类的对象
- 如何将超类的受保护成员访问到其派生类. 如果已在派生类中声明了具有相同名称的函数?
- 在从给定超类继承的所有类上调用虚函数
- 如何使 Swig 发出C++超类
- 如何根据构造函数参数使用超类类型初始化成员变量?
- C++:从类型索引中获取超类类型索引
- 设计问题:仅对子类应用特定处理,仅操作超类