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

时间:2013-08-13 21:34:11

标签: c++ qt inheritance qt5

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

我的直觉是选择取决于复杂程度,但分界线并不总是明确的。是否有最佳实践?

4 个答案:

答案 0 :(得分:3)

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

可读性是一回事。灵活性,可维护性和可扩展性是要记住的其他重要功能。

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

答案 1 :(得分:1)

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

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

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

我尽可能地尝试使用合成。

答案 2 :(得分:1)

我只能从个人经历中回答你。导致派上课的主要因素是:

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

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

  • 您可以将一些插槽定义为对外部信号的响应。

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

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

最重要的事实是:尽可能使代码最具可读性和组织性。请记住,编译器可能会因为优化器而改变整个程序!!!

答案 3 :(得分:0)

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

使用作为抽象基类的Shape类的示例,我们可以继承它来创建三角形,圆形,矩形等类,因为每个继承的类都是一种Shape类,每个类都添加 new现有基类的属性和/或功能

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

在你的QFrame示例中,我个人不建议仅使用继承来设置对象,但是如果有父类,则在父类中创建单独的启动函数。但是,如果您要添加属性或功能来创建不同类型的QFrame,那么继承是可行的方法。

实际上,只要你的代码有效,就没有正确或错误的方法,但是试图坚持使用它们所设计的技术将使你的代码更容易阅读,更容易维护。