【问题标题】:A set of classes with similar interfaces but different method signatures一组具有相似接口但方法签名不同的类
【发布时间】:2014-05-20 19:46:57
【问题描述】:

我有越来越多的工作类,它们共享一个非常相似的接口,但在它们的方法中使用不同的参数。它们看起来有点像这样:

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 基类时遇到了问题。另一方面,我觉得必须有一些更优雅的设计来避免代码重复或至少在所有类中强制执行公共接口。

【问题讨论】:

  • 如果它们不共享相同的doWork() 和signalResultReady() 签名,您的类就不能使用多态/虚拟访问,所以一个通用接口不能完全覆盖这些部分。跨度>

标签: c++ multithreading qt inheritance design-patterns


【解决方案1】:

我更愿意为 各种参数 [VARIOUS_PARAMS] 创建基础结构,并且 为我的工人类创建一个基类,它定义了 doWork(VARIOUS_PARAMS * param) , 并制作不同的 VARIOUS_PARAMS 子结构。

结构 VARIOUS_PARAMS_SOME_CLASS : VARIOUS_PARAMS { };

【讨论】:

  • 这几乎是我最终选择的路线。
【解决方案2】:

我会这样定义基类:

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 */ );
};

【讨论】:

    【解决方案3】:

    如果成员函数:

    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); 
    

    【讨论】:

      猜你喜欢
      • 2015-10-23
      • 1970-01-01
      • 2018-11-04
      • 1970-01-01
      • 2015-11-02
      • 2011-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多