DP extension Object

#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");
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值