QT:私有成员而不是继承?是什么原因?这是一个具体的概念吗?
QT: Private member instead of inheritance? What is the reason? Is this a specific concept?
前段时间我用 QT Designer / QT Creator 编写了一个 GUI。
对于这个问题,我将首先说明使用上述 IDE 创建 GUI 的一般过程如何工作的示意图:
- 使用 QT Designer 创建设计 -> 获取 .ui 个文件
- .ui 文件被翻译成头文件,你特别得到类似 "UIbasisclass.h" (with class
UIbasisclass
) .
- 你创建了一个类似 "UIsubclass.h" 的东西(有 class
UIsubclass
)你自己创建了一个私有成员 UIbasisclass ui
.
class内的代码UIsubclass
:
...
private:
Ui::UIbasisclass ui;
...
最后你会在main方法中创建一个UIsubclass
的对象 -> 代码:
...
UIsubclass *MyGUI = new UIsubclass();
...
其中 UIsubclass 的构造函数包含以下代码:
...
ui.setupUi(this);
...
简而言之:我们有一个主要负责应用方法的UIsubclass
,还有一个名为ui
的私有成员UIbasisclass
,主要由设计代码组成。
当我们创建一个 UIsubclass
的对象时,它的私有成员 UIbasisclass ui
在 UIsubclass
的构造函数中用 UIsubclass
本身的对象初始化(?)。 [参见:这个指针]
我现在的问题是:
为什么没有像UIsubclass
继承自UIbasisclass
那样使用继承?相反,UIbasisclass
的一个对象成为 UIsubclass
.
的成员
这是一些特定的有利概念(如果是,它有哪些优点或它是如何命名的?)还是"just"QT代码结构的必要性?
如果我必须说明我的问题或有任何问题,请告诉我。
您可以使用私有继承,它甚至在 Qt documentation 中有记载。
ui默认使用私有成员,因为Qt Creator使用的模板,Qt本身并不关心。
Why isn't there used inheritance in the way that UIsubclass
inherits from UIbasisclass
?
您是在问我们为什么不在自己的代码中这样做?去做就对了。由你决定。它确实是 您的 代码。 您负责其设计。如果您使用的是模板,它可以帮助您入门,但不能为您设计软件。责任在你,也只在你。
it "just" a necessity of the QT code structure?
没有这个必要。 Ui
class 是一个 POD class,带有一堆指针和一个方法。没什么大不了的。如果你想从它私有继承:继续。
因为使用私有成员,您可以转发声明生成的 class:
namespace Ui {
class MyForm;
}
class Foo {
private:
Ui::MyForm *ui;
};
然后在 .cpp 文件中插入包含。
这样,此文件的所有可能包含都不必再次预处理该文件。
前段时间我用 QT Designer / QT Creator 编写了一个 GUI。 对于这个问题,我将首先说明使用上述 IDE 创建 GUI 的一般过程如何工作的示意图:
- 使用 QT Designer 创建设计 -> 获取 .ui 个文件
- .ui 文件被翻译成头文件,你特别得到类似 "UIbasisclass.h" (with class
UIbasisclass
) . - 你创建了一个类似 "UIsubclass.h" 的东西(有 class
UIsubclass
)你自己创建了一个私有成员UIbasisclass ui
.
class内的代码UIsubclass
:
...
private:
Ui::UIbasisclass ui;
...
最后你会在main方法中创建一个UIsubclass
的对象 -> 代码:
...
UIsubclass *MyGUI = new UIsubclass();
...
其中 UIsubclass 的构造函数包含以下代码:
...
ui.setupUi(this);
...
简而言之:我们有一个主要负责应用方法的UIsubclass
,还有一个名为ui
的私有成员UIbasisclass
,主要由设计代码组成。
当我们创建一个 UIsubclass
的对象时,它的私有成员 UIbasisclass ui
在 UIsubclass
的构造函数中用 UIsubclass
本身的对象初始化(?)。 [参见:这个指针]
我现在的问题是:
为什么没有像
UIsubclass
继承自UIbasisclass
那样使用继承?相反,UIbasisclass
的一个对象成为UIsubclass
. 的成员
这是一些特定的有利概念(如果是,它有哪些优点或它是如何命名的?)还是"just"QT代码结构的必要性?
如果我必须说明我的问题或有任何问题,请告诉我。
您可以使用私有继承,它甚至在 Qt documentation 中有记载。
ui默认使用私有成员,因为Qt Creator使用的模板,Qt本身并不关心。
Why isn't there used inheritance in the way that
UIsubclass
inherits fromUIbasisclass
?
您是在问我们为什么不在自己的代码中这样做?去做就对了。由你决定。它确实是 您的 代码。 您负责其设计。如果您使用的是模板,它可以帮助您入门,但不能为您设计软件。责任在你,也只在你。
it "just" a necessity of the QT code structure?
没有这个必要。 Ui
class 是一个 POD class,带有一堆指针和一个方法。没什么大不了的。如果你想从它私有继承:继续。
因为使用私有成员,您可以转发声明生成的 class:
namespace Ui {
class MyForm;
}
class Foo {
private:
Ui::MyForm *ui;
};
然后在 .cpp 文件中插入包含。
这样,此文件的所有可能包含都不必再次预处理该文件。