Double Dispatch手法

首先要明白Dispatch 是什么

多态的实现,是通过一个虚表 达到运行时决策,真正调用的 为真正的对象来决定,这叫做一次 dispatch (实现一次多态的 动态决定)

Double dispatch 应用 在什么地方呢?,其中设计模式中的Visitor 就是一种实现

Visitor模式连接    http://my.oschina.net/kkkkkkkkkkkkk/blog/670610

先看以下代码的问题

class Monster;
class FlyMonster;
class WalkMonster;



class MonsterMgr
{
public:
	void Add(Monster*monster)
	{
		cout << "Monster" << endl;
	}
	void Add(FlyMonster*fly)
	{
		cout << "fly" << endl;
	}

	void Add(WalkMonster*walk)
	{

		cout << "walk" << endl;
	}
};



class Monster
{
public:

};

class FlyMonster:public Monster
{
public:
};

class WalkMonster :public Monster
{
public:

};

int main(int argc, char *argv[])
{
	Monster *monster = new FlyMonster;

	MonsterMgr *mgr = new MonsterMgr;


	mgr->Add(monster);
	system("pause");
	return 0;
}

由于Add 有多个重载版本,重载编译时就确定了,因为变量monster 声明类型为Monster 所以调用的是Monster版本的 Add,并不是期望的FlyMonster版本

所以我们要再添加一次dispatch达到目的,

原本设计是Mgr 添加怪物,现在改为怪物吧自己添加到Mgr里面,达到再次Dispatch。 从而达到期望的调用Fly 版本的Add,子类的this才是真正的运行时期对象。

给我的感觉是这种设计更像是反向,C++ 不支持的double dispatch 就可以通过这样解决

class Monster;
class FlyMonster;
class WalkMonster;

class MonsterMgr
{
public:
	void Add(Monster*monster)
	{
		cout << "Monster" << endl;
	}
	void Add(FlyMonster*fly)
	{
		cout << "fly" << endl;
	}

	void Add(WalkMonster*walk)
	{

		cout << "walk" << endl;
	}
};



class Monster
{
public:
	virtual void AddToMgr(MonsterMgr*m)
	{
		m->Add(this);
	}
};

class FlyMonster:public Monster
{
public:
	virtual void AddToMgr(MonsterMgr*m)
	{
		m->Add(this);
	}
};

class WalkMonster :public Monster
{
public:
	virtual void AddToMgr(MonsterMgr*m)
	{
		m->Add(this);
	}
};



 

int main(int argc, char *argv[])
{
	Monster *monster = new FlyMonster;

	MonsterMgr *mgr = new MonsterMgr;


	monster->AddToMgr(mgr);


	system("pause");
	return 0;
}


转载于:https://my.oschina.net/kkkkkkkkkkkkk/blog/671305

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
useDispatch是react-redux库中的一个Hook,用于在函数组件中获取dispatch函数。它可以用来触发action并将其发送到Redux store中。通过useDispatch,我们可以在组件中使用dispatch函数来更新状态或执行其他操作。在使用react-redux时,我们可以通过以下方式来使用useDispatch: ```javascript import { useDispatch } from 'react-redux'; const MyComponent = () => { const dispatch = useDispatch(); const handleClick = () => { dispatch({ type: 'INCREMENT' }); }; return ( <button onClick={handleClick}>Increment</button> ); }; ``` 在上面的例子中,我们使用useDispatch来获取dispatch函数,并在按钮的点击事件中使用dispatch来触发一个名为'INCREMENT'的action。这样就可以通过dispatch函数来更新Redux store中的状态了。 #### 引用[.reference_title] - *1* *2* [深刻理解useSelector,useDispatch以及useReducer](https://blog.csdn.net/qq_43372697/article/details/126968428)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [如何使用useDispatch useSelector对我们react中的代码进行简化。](https://blog.csdn.net/m0_70718568/article/details/127571026)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值