Я искал веб-сайт oodesign для примера разделения интерфейса
Я понял пример и написал ниже код на C ++,
#include <iostream>
using namespace std;
class IWorkable {
public:
virtual void work() = 0;
};
class IFeedable{
public:
virtual void eat() = 0;
};
// interface segregation principle - good example
class IWorker : public IFeedable, public IWorkable {
};
class Worker : public IWorkable, public IFeedable
{
public:
void work() {
cout << "working" <<endl;
}
void eat() {
cout << "eating in launch break" <<endl;
}
};
class SuperWorker : public IWorkable, public IFeedable{
public:
void work() {
cout << "working much more" << endl;
}
void eat() {
cout << "eating in launch break" <<endl;
}
};
class Robot :public IWorkable{
public:
void work() {
cout << "Robot working" <<endl;
}
};
class Manager {
IWorkable *worker;
public :
void setWorker(IWorkable *w) {
worker = w;
}
void manage() {
worker->work();
}
};
int main()
{
IWorkable * w1 = new Worker();
IWorkable * sw1 = new SuperWorker();
IWorker *w2;
Manager m1;
m1.setWorker(w1);
m1.manage();
//When worker wants he can eat
w2 = dynamic_cast<IWorker*>(w1);
w2->eat();
return 0;
}
Когда я запускаю вышеуказанный код, я получаю ошибку сегментации в w2->eat();
Я предполагаю, что код приводит только указатель IWorkable
к IWorker
, который не будет работать, потому что IWorkable
не имеет eat
метода.
Если так, каким было бы решение в этом случае?
Любое предложение / указатель поможет.
Примечание : я пробую это в C ++ 98, однако я открыта для изучения нового пути в C ++ 11/14/17.