条款 34 :区分接口继承和实现继承

条款 30 :考虑virtual函数以外的其他选择

Consider alternative to virtual functions

假设你在写一个游戏,其中有一个反映人物血量状态的函数,不同的人物有不同的生命计算方式,所以将其声明为virtual;我们没有声明为pure virtual意味着我们该给他一份缺省实现。

class Game{
    public:
    virtual int healthValue()const;//返回人物健康指数
                                  //派生类可以从新定义他
}

我们来看看上述基于继承体系的设计方案的一些其他方案:

  1. 由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函数”则表示他何时被完成。

后面好难啊,下次一定写。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值