我有越来越多的工作类,它们共享一个非常相似的接口,但在它们的方法中使用不同的参数。他们看起来有点像这样:
class SomeWorker : public QObject
{
Q_OBJECT
public:
explicit SomeWorker(QObject *parent = 0);
~SomeWorker();
public slots:
void doWork( /* various params */ );
signals:
void signalResultReady( /* various param */ );
void signalError(QString errorMessage);
void signalStatus(QString status);
void signalProgress(int progress);
};
因为这些类采用doWork()
方法的各种参数并通过signalResultReady()
信号返回不同的对象,所以我在创建基类Worker
类时遇到问题,该类将指定公共接口。另一方面,我觉得必须有一些更优雅的设计,这将允许我避免代码重复或至少强制执行所有类中的公共接口。
答案 0 :(得分:0)
我将按如下方式定义基类:
class BaseWorker : public QObject
{
Q_OBJECT
public:
BaseWorker (QObject *parent = 0);
~SomeWorker();
signals:
void signalError(QString errorMessage);
void signalStatus(QString status);
void signalProgress(int progress);
};
以下列方式的工人类:
class SomeWorker : public BaseWorker
{
Q_OBJECT
public:
SomeWorker(QObject *parent = 0);
~SomeWorker();
public slots:
void doWork( /* various params */ );
signals:
void signalResultReady( /* various param */ );
};
答案 1 :(得分:0)
如果该成员有效:
void doWork( /* various params */ );
void signalResultReady( /* various param */ );
接收相同数量的参数并且只在它们的类型上有所不同,你可以使用这样的模板(让我们假设他们期望3个参数作为输入):
template<class T1, class T2, class T3> void doWork(T1 a1, T2 a2, T3 a3);
template<class Z1, class Z2, class Z3> void signalResultReady(Z1 b1, Z2 b2, Z3 b3);
答案 2 :(得分:0)
我更希望为 各种参数 [VARIOUS_PARAMS]创建基本结构,以及 为我的worker类创建一个基类,它定义了doWork(VARIOUS_PARAMS * param), 并制作不同的VARIOUS_PARAMS子结构。
struct VARIOUS_PARAMS_SOME_CLASS:VARIOUS_PARAMS { };