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