设为首页 加入收藏

TOP

Effective C++ Item 35 考虑 virtual 函数以外的实现
2015-07-20 18:07:39 来源: 作者: 【 】 浏览:7
Tags:Effective Item 考虑 virtual 函数 以外 实现

?

?

1.virtual 函数版本

class GameCharacter{
public:
	virtual int healthValue() const; //返回人物的健康指数, derived classes 可重新定义它
};

2.使用 non-virtual interface 手法,那是 Template Method 设计模式的一种特殊形式。
让客户通过 public non-virtual 成员函数间接调用 private virtual 函数
class GameCharacter{
public:
	int healthValue() const // Item 36 derived classes不重新定义它
	{
		//...
		int retVal = doHealthValue();
		//...
		return retVal;
	}
private:
	virtual int doHealthValue() const //derive classes 可重新定义它
	{
		//...  缺省算法
	}
};


3.将 virtual 函数替换为“函数指针成员变量”,这是 Strategy 设计模式的一种分解表现形式。
优点:每天个对象可各自自己的健康计算函数、可在运行期改变计算函数
缺点:可能必须降低 GameCharacter 封装性。例如 声明 non-member 函数为 friends 或为其实现的某一部分提供 public 访问函数
//1.藉由 Function Pointers 实现 Strategy 模式


int defaultHealthCalc(const GameCharacter &gc);//计算健康指数的缺省算法

class GameCharacter{
public:
	typedef int (*HealthCalcFunc)(const GameCharacter);
	explicit GameCharacter(HealthCalcFunc hcf = defaultHealthCalc) : healthFunc(hcf){}
	int healthValue() const{
		return healthFunc(*this);
	}
	//...
private:
	HealthCalcFunc healthFunc;
};

//2.藉由 tr1::function 完成 Strategy 模式
//以 tr1::function 成员变量替换 virtual 函数,因而允许使用任何可调用物(callable entity)
搭配一个兼容于需求的签名式。这也是 Strategy 设计模式的某种形式。

class GameCharacter;
int defaultHealthCalc(const GameCharacter &gc);
class GameCharacter{
public:
	//HealthCalcFunc 可以是任何“可调用物”,可被调用并被接受任何兼容于 GameCharacter 之物,返回任何兼容于 int的东西
	typedef std::tr1::function
  
    HealthCalcFunc;
	explicit GameCharacter(HealthCalcFunc hcf = defaultHealthCalc) : healthFunc(hcf){}
	int healthValue() const{
		return healthFunc(*this);
	}
	//...
private:
	HealthCalcFunc healthFunc;
};
  


4.将继承体系内的 virtual 函数替换为另一个继承体系内的 virtual 函数。这是 Strategy 设计模式
的传统实现手法。
class GameCharacter;
class HealthCalcFunc{
public:
	//...
	virtual int calc(const GameCharacter &gc) const{...}
};


HealthCalcFunc defaultHealthCalc;
class GameCharacter{
public:
	explicit GameCharacter(HealthCalcFunc *phcf = &defaultHealthCalc) : pHealthCalc(phhcf){}
	int healthValue() const {return pHealthCalc->calc(*this);}
private:
	HealthCalcFunc *pHealthCalc;
};



】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇如何在网络中传输二叉树(C++源代.. 下一篇Effective C++ Item 47 请使用 tr..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: