条款35:考虑virtual函数以外的其他选择
2015-10-18 16:55
393 查看
有一部分人总是主张virtual函数几乎总应该是private:例如下面这个例子,例子时候游戏,游戏里面的任务都拥有健康值这一属性:
这里使用一个外覆器的好处是:了一使用外覆器在调用虚函数之前以及之后分别做一些特定的操作。例如锁定mutex或者是解锁mutex这种事。
上面这个可以称为Template Method模式的一种特例:
还有用function Pointer实现的strategy模式;假如healthValue的规则有一个内含的成员healthFunc来进行指定(这样降低了耦合)
实际上,这个typedef带来的弹性是很大的:
上面这些例子都可以正确通过切运行,这说明这种方式给我们带来的弹性是很大的。
不仅如此,这种方式在延伸一下就可以设计出来典型的策略模式:
小结:
virtual函数的替代方案包括nv1手法以及strategy设计模式等多种形式
将机能从成员函数移动到class外部函数,带来的缺点是非成员函数无法访问class的non-public成员
注意function已经bind的使用
class GameCharacter{ public: int healthValue()const{ ... int retVal = doHealthValue(); ... return retVal; } private: virtual int doHealthValue() const { }//上面的这个non-virtual函数实际上是virtual函数的一个外覆器 };
这里使用一个外覆器的好处是:了一使用外覆器在调用虚函数之前以及之后分别做一些特定的操作。例如锁定mutex或者是解锁mutex这种事。
上面这个可以称为Template Method模式的一种特例:
还有用function Pointer实现的strategy模式;假如healthValue的规则有一个内含的成员healthFunc来进行指定(这样降低了耦合)
class GameCharacter; int defaultHealthCalc(const GameCharacter & gc); class GameCharacter{ public: typedef std::function<int (const GameCharacter & )> HealCalcFunc explicit GameCharacter(HealCalcFunc hcf = defaultHealthCalc) :healthFunc(hcf){} int healthValue() const {return healthFunc(* this); } ... private: HealCalcFunc healthFunc; };
实际上,这个typedef带来的弹性是很大的:
short clacHealth(const GameCharacter &); //或者是一个函数对象 struct HealCalculater{ public: float operator()(const GameCharacters & gc) const ; }; //或者是一个成员函数。 class GameLevel{ public: float Health(const GameCharacters)const; }; GameCharacters character1(clacHealth); GameCharacters character2(HealCalculater()); GameLevel levelObj; GameCharacters character3(std::bind(&GameLevel::health, levelObj, _1));//不记得这样写对不对,待查
上面这些例子都可以正确通过切运行,这说明这种方式给我们带来的弹性是很大的。
不仅如此,这种方式在延伸一下就可以设计出来典型的策略模式:
class HealCalculater; class GameCharacter; int defaultHealthCalc(const GameCharacter & gc); class GameCharacter{ public: typedef std::function<int (const GameCharacter & )> HealCalcFunc explicit GameCharacter(HealCalcFunc hcf = defaultHealthCalc) :healthFunc(hcf){} int healthValue() const {return healthFunc(* this); } ... private: HealCalcFunc * phealthFunc; }; HealCalculater{ public : virtual int calc(const GameCharacter & gc)const {} //也可以只声明一个接口 }
小结:
virtual函数的替代方案包括nv1手法以及strategy设计模式等多种形式
将机能从成员函数移动到class外部函数,带来的缺点是非成员函数无法访问class的non-public成员
注意function已经bind的使用
相关文章推荐
- Java基础知识强化之网络编程笔记16:Android网络通信之 使用Http的Get方式读取网络数据(基于HTTP通信技术)
- 企业微信公众平台订阅号运营11大技巧
- $().each() 与 $.each()解析
- STM32F4——内存管理
- Git分支管理策略
- iOS开发注意⚠ 持续更新
- 三、RemoteViews
- 九度OJ 1037:Powerful Calculator(强大的计算器) (大整数运算)
- Linux软连接和硬链接
- 九度OJ 1037:Powerful Calculator(强大的计算器) (大整数运算)
- 问世间最大的乐趣是什么?
- JS编程去掉注释部分
- 51nod 1423:最大二“货”
- PIC单片机ISP下载外围链接电路
- chapter 12
- 条款34:区分接口继承以及实现继承
- 51nod 1423:最大二“货”
- windows安装TortoiseGit详细使用教程
- JDBC 基本操作案例
- HTML学习笔记之超链接的使用