我们正在设计一个新系统,我们为大多数类创建了接口,以便我们可以为它们创建模拟(谷歌模拟)以进行单元测试。因此,所有功能都是虚拟的,但问题是我经常遇到模板虚拟功能问题。我已经看到了一些关于如何进行多调度的示例,但它们似乎都在使用一些模板的变体,它看起来并不简单。那么这是否意味着我的整个代码库现在最终会出现难以读取/使用和调试的模板?
或者我没有设计好的接口。这是一个简单的例子,我在为消息队列编写接口。
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
}
};
如何解决这个问题?这只是一个例子,但由于基于接口的编程,我遇到了很多这类问题。
答案 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);
};