【发布时间】:2021-02-07 13:28:40
【问题描述】:
我有几个类,继承自一个基类。我想为所有子类添加一些功能,确切地说是一个计时器,以及处理它的函数,除了一个。因此,我不能只将此代码添加到父类。处理此任务的最佳方法是什么,避免代码复制?谢谢!
【问题讨论】:
标签: c++ qt inheritance
我有几个类,继承自一个基类。我想为所有子类添加一些功能,确切地说是一个计时器,以及处理它的函数,除了一个。因此,我不能只将此代码添加到父类。处理此任务的最佳方法是什么,避免代码复制?谢谢!
【问题讨论】:
标签: c++ qt inheritance
您可以使用 mixin,创建一个带有计时器的类,以及其他想要使用它的类从它继承。如果可能,此类不应继承任何形式。
编辑以添加示例:
你创建了一个没有从QObject继承的类:
class TimerMixIn {}
让任何需要使用TimerMixIn的类都继承自它:
class A : public QObject, public TimerMixIn {}
class B : public QWidget, public TimerMixIn {}
【讨论】:
如果您确定这些类最好以层次结构的形式表示,那么您可以执行以下操作之一:
将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类提供了一个高级编程接口 单次定时器和定时器信号而不是事件。还有 一个QBasicTimer比QTimer更轻量级且更少的类 比直接使用计时器 ID 更笨拙。
【讨论】:
您遇到此问题表明您的继承结构存在问题。
您可以创建一个 BaseWithTimer 类,除了 1 个类之外的所有类都继承自该类。即:
Base
`- BaseWithTimer
| `- A
| - B
`- C
【讨论】: