Qt:何时使用继承与设置属性?

Posted

技术标签:

【中文标题】Qt:何时使用继承与设置属性?【英文标题】:Qt: when to use inheritance vs. setting attributes? 【发布时间】:2013-08-13 21:34:10 【问题描述】:

我是 Qt 的相对新手。经常出现的一个问题是我经常不确定是否使用继承。例如,要设置和自定义一个 QFrame,我可以实例化一个 QFrame 并设置它的所有属性(包括子对象)。或者,我可以将 qframe 子类化并将所有设置代码放在类的构造函数(或构造函数调用的函数)中。

我的直觉是,选择取决于复杂程度,但分界线并不总是明确的。有这方面的最佳做法吗?

【问题讨论】:

如果只是设置几个属性,我会选择一个免费函数 FunkyFrame* createFrame(QWidget* parent);或类似的东西。 【参考方案1】:

最佳实践?不要滥用继承权。继承主要是关于多态性。有时代码重用。但从不只是为了初始化一个对象。

可读性是一回事。灵活性、可维护性和可扩展性是其他需要牢记的重要特性。

我可以指出这篇文章: http://www.gotw.ca/publications/mill06.htm

【讨论】:

【参考方案2】:

这是一个有趣的问题。我的经验是使用 Qt4。我逐渐转向 Qt5 并学习 Qml,因为这似乎已成为 Qt 的标准和编写 GUI 的方式。

我在工作中使用 Qt,我们所做的是更喜欢设置属性避免继承。问题是您必须继承一些 Qt 类才能在其受保护的方法中返回一些值。 sizeHint 就是一个例子。

从 Qt 继承有时意味着编写额外的代码并调用超级方法来获取类的默认行为,有时可能会忘记调用超级方法,而您会得到不希望的行为。

我尽量使用作曲。

【讨论】:

【参考方案3】:

我只能根据我的个人经验来回答你。导致派生类的主要因素有这些:

你的类变得复杂了,有很多特定的设置(样式、大小、属性)。将它们固定在构造函数上很容易,并使代码更具可读性和组织性。

您觉得将一些您在外部实施的方法移入其中似乎是合乎逻辑的。例如,对事件或过滤器的一些响应。

您会发现将一些槽定义为对外部信号的响应很有用。

您会发现实现小部件产生的信号很有用。

您会发现从中派生新类和/或在其他应用程序中重用它很有用。

还有最重要的一点:尽量让您的代码更具可读性和组织性。请记住,编译器可能会因为它的优化器而改变整个程序!!!

【讨论】:

【参考方案4】:

是否使用继承通常不应该决定如何初始化一个类的对象,而是你需要创建什么类型的对象以及你是否扩展类强>。

使用作为抽象基类的Shape类的示例,我们可以继承它来制作Triangle,Circle,Rectangle等类,因为每个继承的类都是Shape的一种类型,每个类都添加new现有基类的属性和/或功能

但是,如果我们要添加一个 Square 类,有些人会认为它不是必需的,但它增加了确保边相等的功能,因此这是继承的有效参数。

在您的 QFrame 示例中,我个人不建议仅使用继承来设置对象,而是会在父类(如果有的话)或 main 中创建单独的初始化函数。但是,如果您要添加属性或功能来创建不同类型的 QFrame,那么继承就是要走的路。

实际上,只要您的代码有效,就没有真正正确或错误的方法,但尝试坚持其设计用途的技术将使您的代码更易于阅读和维护。

【讨论】:

以上是关于Qt:何时使用继承与设置属性?的主要内容,如果未能解决你的问题,请参考以下文章

何时在计算属性设置器上使用方法,反之亦然?

Qt 标准对话框

如何在 Qt 中为场景中的对象设置属性

正确设置 QStackedWidget,信号看不到功能/插槽

Qt滑动条设计与实现

Qt动画窗口,Qt之对话框消失动画