#include <iostream>
using namespace std;
#include <unordered_map>
#include <string>
//#include "Source2.c"
class Role{
};
class Isubject{
public :
virtual Role * GetExtension(string name){
return NULL;
}
virtual void addExtesnion(string name, Role *role){}
virtual void removeExtension(string name){}
};
class IBasicAction{
public:
virtual void MoveArms(){}
virtual void MoveLegs() {};
virtual void eat() {};
};
class ISoldierAction : public IBasicAction{
public:
virtual void eatMoving() = 0;
};
class IpeasantsAction : public IBasicAction{
public:
virtual void claim() = 0;
};
class Sheep : public Isubject, public IBasicAction{
unordered_map<string, Role *> mp;// key value;
public:
virtual Role * GetExtension(string name){
return mp[name];
}
virtual void addExtesnion(string name, Role *pr){
mp[name] = pr;
}
virtual void removeExtension(string name){
mp.erase(name);
}
virtual void MoveArms(){
cout << "mv arms" << endl;
}
virtual void MoveLegs(){
cout << "mv legs" << endl;
}
virtual void eat(){
cout << "eat" << endl;
}
};
class SoldierRules : public Role, ISoldierAction{
private:
IBasicAction * ib;
public:
SoldierRules(IBasicAction * iib){
this->ib = iib;
}
virtual void eatMoving(){
cout << "I am a soldier" << endl;
ib->eat();
ib->MoveArms();
}
};
class peasantsroles: public Role, public IpeasantsAction{
private:
IBasicAction * ib;
public:
peasantsroles(IBasicAction * iib){
this->ib = iib;
}
virtual void claim(){
cout << "peasantsroles claim. I will move arms and move legs" << endl;
ib->MoveArms();
ib->MoveLegs();
}
};
int main()
{
Sheep * psp = new Sheep;
IBasicAction * pbases = dynamic_cast<IBasicAction *>(psp);
peasantsroles * p2 = new peasantsroles(pbases);
psp->addExtesnion("pr", p2);
//IBasicAction * pb2 = psp->GetExtension("pr");
peasantsroles * p = (peasantsroles *)(psp->GetExtension("pr"));
p->claim();
SoldierRules * p3 = new SoldierRules(pbases);
psp->addExtesnion("sr", p3);
SoldierRules * sp = (SoldierRules*)psp->GetExtension("sr");
sp->eatMoving();
system("pause");
}
without role;
#include <iostream>
using namespace std;
#include <unordered_map>
#include <string>
//#include "Source2.c"
class IBasicAction{
public:
virtual void MoveArms(){}
virtual void MoveLegs() {};
virtual void eat() {};
};
class Isubject{
public :
virtual IBasicAction * GetExtension(string name){
return NULL;
}
virtual void addExtesnion(string name, IBasicAction *role){}
virtual void removeExtension(string name){}
};
class ISoldierAction : public IBasicAction{
public:
virtual void eatMoving() = 0;
};
class IpeasantsAction : public IBasicAction{
public:
virtual void claim() = 0;
};
class Sheep : public Isubject, public IBasicAction{
unordered_map<string, IBasicAction *> mp;// key value;
public:
virtual IBasicAction * GetExtension(string name){
return mp[name];
}
virtual void addExtesnion(string name, IBasicAction* act){
mp[name] = act;
}
virtual void removeExtension(string name){
mp.erase(name);
}
virtual void MoveArms(){
cout << "mv arms" << endl;
}
virtual void MoveLegs(){
cout << "mv legs" << endl;
}
virtual void eat(){
cout << "eat" << endl;
}
};
class SoldierRules : public ISoldierAction{
private:
IBasicAction * ib;
public:
SoldierRules(IBasicAction * iib){
this->ib = iib;
}
virtual void eatMoving(){
cout << "I am a soldier" << endl;
ib->eat();
ib->MoveArms();
}
};
class peasantsroles: public IpeasantsAction{
private:
IBasicAction * ib;
public:
peasantsroles(IBasicAction * iib){
this->ib = iib;
}
virtual void claim(){
cout << "peasantsroles claim. I will move arms and move legs" << endl;
ib->MoveArms();
ib->MoveLegs();
}
};
int main()
{
Sheep * psp = new Sheep;
IBasicAction * pbases = dynamic_cast<IBasicAction *>(psp);
peasantsroles * p2 = new peasantsroles(pbases);
psp->addExtesnion("pr", p2);
IBasicAction * pb2 = psp->GetExtension("pr");
peasantsroles * p = dynamic_cast<peasantsroles *>(pb2);
p->claim();
SoldierRules * p3 = new SoldierRules(pbases);
psp->addExtesnion("sr", p3);
SoldierRules * sp = (SoldierRules*)psp->GetExtension("sr");
sp->eatMoving();
system("pause");
}