条款 30 :考虑virtual函数以外的其他选择
Consider alternative to virtual functions
假设你在写一个游戏,其中有一个反映人物血量状态的函数,不同的人物有不同的生命计算方式,所以将其声明为virtual;我们没有声明为pure virtual意味着我们该给他一份缺省实现。
class Game{
public:
virtual int healthValue()const;//返回人物健康指数
//派生类可以从新定义他
}
我们来看看上述基于继承体系的设计方案的一些其他方案:
- 由Non-Virtual_Interface手法实现Template Method模式
我们先介绍一个有趣的思想流派:这个流派主张virtual函数应该总是private.所以对他们来说:较好的设计是保留healthValue为public函数,但不是虚函数,并调用一个private virtual函数。Function
class Game{
public:
int healthValue()const{
...//作一些事前工作
int retValue=doHealth();//作真正工作
...//作一些事后工作
return ret;}
private:
virtual int doHealth()const{...};//派生类可重新定义他
}
我们称之为NVI手法,把这个非虚函数称为private virtual函数的外覆器(wrapper)。NVI手法的优点隐含在上述代码注释中的作一些事前事后工作中。这就意味着wrapper确保得以在一个virtual函数被调用之前设定好场景,并在调用之后清理场景。我们看到NVI手法允许派生类重新定义private virtual函数,也就是重新定义若干个派生类并不调用的函数。这里并不矛盾,“重新定义virtual函数”表示这些事情如何完成,“调用virtual函数”则表示他何时被完成。
后面好难啊,下次一定写。。。。