#include <iostream>
using namespace std;
struct IService {
virtual ~IService() = default;
virtual void DoWork() = 0;
virtual bool IsRunning() = 0;
};
class ClientA : public IService {
void DoWork() {
std::cout << "Work in progress inside A" << endl;
}
bool IsRunning() {
return true;
}
};
class ClientB : public IService {
void DoWork() {
std::cout << "Work in progress inside B" << endl;
}
bool IsRunning() {
return true;
}
};
class Server {
IService* _service;
public:
Server(IService* service) : _service(service)
{ }
void doStuff() {
_service->DoWork();
}
};
int main() {
ClientA a;
ClientB b;
Server sa(&a), sb(&b);
cout << "ServerA: " << endl;
sa.doStuff();
cout << "ServerB: " << endl;
sb.doStuff();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IElTZXJ2aWNlIHsKCXZpcnR1YWwgfklTZXJ2aWNlKCkgPSBkZWZhdWx0OwogICAgdmlydHVhbCB2b2lkIERvV29yaygpID0gMDsKICAgIHZpcnR1YWwgYm9vbCBJc1J1bm5pbmcoKSA9IDA7Cn07CgpjbGFzcyBDbGllbnRBIDogcHVibGljIElTZXJ2aWNlIHsKICAgIHZvaWQgRG9Xb3JrKCkgewogICAgICAgIHN0ZDo6Y291dCA8PCAiV29yayBpbiBwcm9ncmVzcyBpbnNpZGUgQSIgPDwgZW5kbDsKICAgIH0KICAgIGJvb2wgSXNSdW5uaW5nKCkgeyAKICAgICAgICByZXR1cm4gdHJ1ZTsgCiAgICB9Cn07CgpjbGFzcyBDbGllbnRCIDogcHVibGljIElTZXJ2aWNlIHsKICAgIHZvaWQgRG9Xb3JrKCkgewogICAgICAgIHN0ZDo6Y291dCA8PCAiV29yayBpbiBwcm9ncmVzcyBpbnNpZGUgQiIgPDwgZW5kbDsKICAgIH0KICAgIGJvb2wgSXNSdW5uaW5nKCkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQp9OwoKY2xhc3MgU2VydmVyIHsKICAgIElTZXJ2aWNlKiBfc2VydmljZTsKcHVibGljOgogICAgU2VydmVyKElTZXJ2aWNlKiBzZXJ2aWNlKSA6IF9zZXJ2aWNlKHNlcnZpY2UpCiAgICB7IH0KCiAgICB2b2lkIGRvU3R1ZmYoKSB7CiAgICAJX3NlcnZpY2UtPkRvV29yaygpOwogICAgfQp9OwoKaW50IG1haW4oKSB7CgoJQ2xpZW50QSBhOwoJQ2xpZW50QiBiOwoJU2VydmVyIHNhKCZhKSwgc2IoJmIpOwoJY291dCA8PCAiU2VydmVyQTogIiA8PCBlbmRsOwoJc2EuZG9TdHVmZigpOwoJY291dCA8PCAiU2VydmVyQjogIiA8PCBlbmRsOwoJc2IuZG9TdHVmZigpOwoJcmV0dXJuIDA7Cn0=