Я бы, вероятно, высмеял это, работая через интерфейс сокетов (т.е. базовый класс) и реализуя тестовую версию этого базового класса.
Вы можете сделать это несколькими способами, например, самая простая вещь - указать весь API сокетов в терминах интерфейса C ++.
class ISocket
{
public:
virtual int socket(int domain, int type, int protocol) = 0;
virtual int bind(int sockfd...) = 0;
// listen, accept, write, etc
};
Затем предоставить конкретную работающую реализациючерез библиотеку сокетов BSD
class CBsdSocketLib : public ISocket
{
public:
// yadda, same stuff but actually call the BSD socket interface
};
class CTestSocketLib : public ISocket
{
public:
// simulate the socket library
};
Кодируя интерфейс, вы можете создать свою тестовую версию, чтобы делать все что угодно.
Однако мы можем ясно видеть, что этот первый проход довольно странный,Мы обертываем целую библиотеку, она на самом деле не является классом в том смысле, что она описывает объекты.
Вы бы предпочли думать с точки зрения сокетов и способов изготовления сокетов.Это было бы более объектно-ориентированным.Вдоль этих строк я бы разделил описанную выше функциональность на два класса.
// responsible for socket creation/construction
class ISocketFactory
{
virtual ISocket* createSocket(...) = 0; // perform socket() and maybe bind()
};
// a socket
class ISocket
{
// pure virtual recv, send, listen, close, etc
};
Для использования в реальном времени:
class CBsdSocketFactory : public ISocketFactory
{
...
};
class CBsdSocket : public ISocket
{
...
};
Для тестирования:
class CTestSocketFactory : public ISocketFactory
{
};
class CTestSocket : public ISocket
{
};
И отдельныйбиблиотека BSD вызывает те два разных класса, которые имеют свои обязанности.