C++/QT继承程序体系结构



我有几个类,从一个基本类继承而来。我想为所有子类添加一些功能,确切地说是计时器,以及处理它的函数,除了一个子类。因为这个原因,我不能只是把这个代码添加到父类中。处理此任务的最佳方法是什么,避免代码复制?谢谢

您可以使用mixin,创建一个带有计时器的类,其他想要使用它的类从中继承。如果可能的话,这个类不应该从任何形式继承。

编辑以添加示例:

您创建了一个没有从QObject:继承的类

class TimerMixIn {}

使任何需要使用TimerMixIn的类从中继承:

class A : public QObject, public TimerMixIn {}
class B : public QWidget, public TimerMixIn {}

出现此问题表明继承结构存在问题。

您可以创建一个BaseWithTimer类,除1个类外,其他类都继承自该类。即:

Base
`- BaseWithTimer
|    `- A
|     - B
`- C

如果您确信这些类最好以层次结构的形式表示,那么您可以执行以下操作之一:

QTimer嵌入基类:

class BaseWithTimer : public QObject
{
Q_OBJECT
protected:
QTimer m_timer;
};

只需继承QObject:

class AnyClassWhereTimerNeeded : public QObject // no need more than just QObject
{
Q_OBJECT
public:
AnyClassWhereTimerNeeded()
{
// To stop the timer you have to save the id it returns
startTimer(1000);        
// But you can start many timers without creation any new objects
startTimer(50);
startTimer(1000);
startTimer(60000);
}
protected:
void timerEvent(QTimerEvent* event) override 
{
// do what you need
}
};

如您所见,第一种方法基于信号和插槽,而第二种方法基于事件。对我来说,嵌入QTimer更方便。

来自文档:

QTimer类提供了一个高级编程接口单触发定时器和定时器信号而不是事件。还有比QTimer更轻且更少的QBasicTimer类比直接使用计时器ID更笨拙。

也不要忘记阅读https://doc.qt.io/qt-5/timers.html

最新更新