Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 设计问题:仅对操作超类的子类应用特定处理_C++_Design Patterns_Architecture - Fatal编程技术网

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

C++ 设计问题:仅对操作超类的子类应用特定处理,c++,design-patterns,architecture,C++,Design Patterns,Architecture,我在一个项目中工作,我有一个我不知道如何解决的设计问题。我想找到代码可扩展性的最佳解决方案。 该项目包含一个带有选项卡的web浏览器,但是在选项卡中不仅有网页,我还可以有其他类型的小部件。 我使用的是Qt,因此选项卡中的小部件是QWidgets(QWebview和其他类型,我仍然需要自己编写代码)。不管怎样,我会尽量让这个问题变得足够一般 有一个类QWidget,有两个类从中继承:QWebView和MyWidget。 我有一个容器(QTabWidget),它可以包含这两个组件,因为它可以包含qw

我在一个项目中工作,我有一个我不知道如何解决的设计问题。我想找到代码可扩展性的最佳解决方案。 该项目包含一个带有选项卡的web浏览器,但是在选项卡中不仅有网页,我还可以有其他类型的小部件。 我使用的是Qt,因此选项卡中的小部件是QWidgets(QWebview和其他类型,我仍然需要自己编写代码)。不管怎样,我会尽量让这个问题变得足够一般

有一个类QWidget,有两个类从中继承:QWebView和MyWidget。 我有一个容器(QTabWidget),它可以包含这两个组件,因为它可以包含qwidget。 此外,我有一个按钮(例如上一页按钮),它只适用于一种QWidget:QWebView。 所以,当我按下这个按钮时,我向QTabWidget询问当前的QWidget,如果是QWebView,我会做一些事情,否则我什么都不做。 这就是问题所在:我需要能够区分这两种不同的类型:如果我让QTabWidget给我currentWidget,它会给我一个QWidget*,但我不知道它是QWwbView还是MyWidget,因此我必须进行令人讨厌的动态转换来检查真正的类型。 这意味着,如果我用另一个操作添加一个新的MyWidget2,我将不得不更新所有有动态\u cast的代码,我不希望这样

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

你有什么建议吗?
感谢

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


一种方法是向基本小部件类型添加一个虚拟成员函数,该函数返回相关操作。然后将选项卡小部件返回的
QWidget
s转换为基本小部件类型。这仍然需要一个cast(因为
QTabWidget
没有准备好返回基本widget类型的widget),但是当您添加新类型的widget时,它消除了可维护性问题。

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


一种方法是向基本小部件类型添加一个虚拟成员函数,该函数返回相关操作。然后将选项卡小部件返回的
QWidget
s转换为基本小部件类型。这仍然需要一个cast(因为
QTabWidget
没有准备好返回基本widget类型的widget),但是当您添加新类型的widget时,它可以消除可维护性问题。

谢谢。但我不明白:我的超类中的虚拟函数如何返回相关操作?它是一个数据结构吗?我不明白,抱歉。@excalibur1491:我设想创建一个数据结构来表示操作,为每个小部件类型返回一组这样的操作,然后在小部件之间切换时使用当前小部件的操作来更新按钮集。我承认我没有把它写得更详细一点——它需要充实一点。谢谢。但我不明白:我的超类中的虚拟函数如何返回相关操作?它是一个数据结构吗?我不明白,抱歉。@excalibur1491:我设想创建一个数据结构来表示操作,为每个小部件类型返回一组这样的操作,然后在小部件之间切换时使用当前小部件的操作来更新按钮集。我承认我没有把它限制在那之外——它需要充实一点。