由于基于接口的编程,运行到c ++虚拟模板功能问题

时间:2017-10-07 13:37:40

标签: c++ api-design googlemock

我们正在设计一个新系统,我们为大多数类创建了接口,以便我们可以为它们创建模拟(谷歌模拟)以进行单元测试。因此,所有功能都是虚拟的,但问题是我经常遇到模板虚拟功能问题。我已经看到了一些关于如何进行多调度的示例,但它们似乎都在使用一些模板的变体,它看起来并不简单。那么这是否意味着我的整个代码库现在最终会出现难以读取/使用和调试的模板?

或者我没有设计好的接口。这是一个简单的例子,我在为消息队列编写接口。

Class IMessageQueue {

   Public:

    Virtual int send(const T & value);  // I can't do this but this is exactly what I want to do, as send should be able to send any type 

};

Class MessageQueue : public IMessageQueue {
      Public:

       Virtual int send(const T & value) { ... }
};

Class MockMQ : public IMessageQueue {
      Public: 
         Virtual int send(const T & value) {
               // mock implementation
          }
};

如何解决这个问题?这只是一个例子,但由于基于接口的编程,我遇到了很多这类问题。

1 个答案:

答案 0 :(得分:0)

这取决于您是否需要IMessageQueue来分派特定的未知类型或任何类型。这不是一回事。

可以通过

管理特定的未知类型
template<typename T>
class IMessageQueue {
public:
  virtual int send(const T& value);
}

这样您就可以拥有IMessageQueue<MyMessage>IMessageQueue<OtherMessage>

相反,如果您需要能够发送具有相同类型的消息队列的任何类型,那么您的选择是声明所有消息共有的特定接口,如

class Message
{
protected:
  Message() : { .. }
};

class MyMessage : public Message
{
..
};

class MessageQueue
{
public:
  void send(const Message& message);
};