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

3

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

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


如果只涉及设置一些属性,我会选择一个自由函数 FunkyFrame* createFrame(QWidget* parent); 或类似的方式。 - undefined
4个回答

4
最佳实践?不要滥用继承。继承主要是关于多态性,有时也会涉及到代码重用。但从来不是只为了初始化一个对象而存在的。
可读性是一方面。灵活性、可维护性和可扩展性是其他需要牢记的重要特征。
我可以指向这篇文章:http://www.gotw.ca/publications/mill06.htm

1
这是一个有趣的问题。我的经验是使用Qt4。我正在逐渐转向Qt5并学习Qml,因为这似乎成为编写GUI的Qt标准方式。
在我的工作中,我们倾向于使用设置属性而避免继承。问题在于有一些Qt类必须继承才能返回其受保护方法中的某些值。 sizeHint 就是一个例子。
有时从Qt继承意味着要编写额外的代码并调用超级方法以获取类的默认行为,有时可能会忘记调用超级方法,这将导致不良行为。
我尽可能使用组合。

1
我只能从个人经验回答你的问题。导致派生类产生的主要因素如下:
  • 您的类变得复杂,具有许多特定设置(样式、大小、属性)。在构造函数中修复它们很容易使代码更可读和有组织。

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

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

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

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

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


0
通常不应该根据如何初始化一个类的对象来决定是否使用继承,而是要考虑需要创建的对象类型以及是否需要扩展该类。
以抽象基类Shape为例,我们可以通过继承来创建Triangle、Circle、Rectangle等类,因为每个继承类都是Shape的一种类型,并且每个类都为现有的基类添加了新的属性和功能。
然而,如果我们要添加一个Square类,有人可能会认为这是不必要的,但它增加了确保边长相等的功能,因此这是继承的一个有效理由。
在你提到的QFrame示例中,我个人不建议仅仅为了设置对象而使用继承,而是会在父类(如果有)或主函数中创建一个单独的初始化函数。然而,如果你要添加属性或功能以创建不同类型的QFrame,那么继承是正确的方法。
实际上,只要你的代码能正常工作,就没有真正的对错之分,但是尽量遵循技术设计的原则将使你的代码更易读,更易于维护。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接