条款35:考虑virtual函数以外的其他选择——199

借由Non-Virtual Interface手法实现Template Method模式——200

一个思想流派主张:virtual函数应该几乎总是private。因此较好的设计是保留某些成员函数是public成员函数,但让它成为non-virtual,并调用一个private virtual函数进行实际工作:

class GameDCharacter{
public:
    int healthValue() const
    {
        ...
        int retVal = doHealthValue();
        ...
        return retVal;
    }
    ...
private:
    virtual int doHealthValue() const
    {
        ...     //缺省算法,计算健康指数
    }
};

当然NVI手法在很多情况下并不必要。

借由Function Pointer实现Strategy模式——201

另一个更戏剧性的设计主张“任务健康指数的计算与人物类型无关”,这样的计算完全不需要“人物”这个成分。例如我们可能会要求每个人物的构造函数接受一个指针,指向一个健康计算函数,而我们可以调用该函数进行实际计算:

class GameCharacter;    //前置声明
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;
};

借由tr1::function完成Strategy模式——203

这节和上节必须要有strategy设计模式基础,不然看不懂。暂时搁置。

总结——207

(1)virtual函数的替代方案包括NVI手法及Strategy设计模式的多种形式。NVI手法自身是一个特殊形式的Template Method设计模式。
(2)将机能从成员函数移到class外部函数,带来的一个缺点是,非成员函数无法访问class的non-public成员。
(3)tr1::function对象的行为就像一般函数指针。这样的对象可接纳“与给定之目标签名式兼容”的所有可调用物。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值