我是 Qt 的相对新手。经常出现的一个问题是我经常不确定是否使用继承。例如,要设置和自定义一个 QFrame,我可以实例化一个 QFrame 并设置它的所有属性(包括子对象)。或者,我可以子类化 qframe 并将所有设置代码放在类的构造函数(或构造函数调用的函数)中。
我的直觉是,选择取决于复杂程度,但分界线并不总是明确的。有这方面的最佳实践吗?
我是 Qt 的相对新手。经常出现的一个问题是我经常不确定是否使用继承。例如,要设置和自定义一个 QFrame,我可以实例化一个 QFrame 并设置它的所有属性(包括子对象)。或者,我可以子类化 qframe 并将所有设置代码放在类的构造函数(或构造函数调用的函数)中。
我的直觉是,选择取决于复杂程度,但分界线并不总是明确的。有这方面的最佳实践吗?
最佳实践?不要滥用继承权。继承主要是关于多态性。有时代码重用。但绝不仅仅是初始化一个对象。
可读性是一回事。灵活性、可维护性和可扩展性是其他需要牢记的重要特性。
我可以指出这篇文章: http ://www.gotw.ca/publications/mill06.htm
这是个有趣的问题。我的经验是使用 Qt4。我逐渐转向 Qt5 并学习 Qml,因为这似乎已成为 Qt 的标准和编写 GUI 的方式。
我在工作中使用 Qt,我们所做的是更喜欢设置属性避免继承。问题是您必须继承一些 Qt 类才能在其受保护的方法中返回一些值。sizeHint
是一个例子。
从 Qt 继承有时意味着编写额外的代码并调用超级方法来获取类的默认行为,有时可能会忘记调用超级方法,您会得到不希望的行为。
我尽量使用构图。
我只能以我个人的经历来回答你。导致派生类的主要因素是:
你的类变得复杂了,有很多特定的设置(样式、大小、属性)。将它们固定在构造函数上很容易,并使代码更具可读性和组织性。
您觉得将一些您在外部实施的方法移入其中似乎是合乎逻辑的。例如,对事件或过滤器的一些响应。
您会发现将一些槽定义为对外部信号的响应很有用。
您发现实现小部件产生的信号很有用。
您会发现从中派生新类和/或在其他应用程序中重用它很有用。
最重要的事实是:尽量使您的代码具有最可读性和组织性。请记住,编译器可能会因为它的优化器而改变整个程序!!!
是否使用继承通常不应该决定如何初始化一个类的对象,而是你需要创建什么类型的对象以及你是否扩展类。
使用作为抽象基类的 Shape 类的示例,我们可以继承它来创建诸如 Triangle、Circle、Rectangle 等类,因为每个继承的类都是 Shape 的一种类型,并且每个类都添加新的属性和/或功能到现有的基类。
但是,如果我们要添加一个 Square 类,有些人会认为它不是必需的,但它增加了确保边相等的功能,因此这是继承的有效论据。
在您的 QFrame 示例中,我个人不建议仅使用继承来设置对象,而是会在父类(如果有的话)或 main 中创建一个单独的初始化函数。但是,如果您要添加属性或功能来创建不同类型的 QFrame,那么继承就是要走的路。
实际上,只要您的代码有效,就没有真正的正确或错误方法,但尝试坚持其设计用途的技术将使您的代码更易于阅读和更易于维护。