描述一下


游戏版本升级的时候,需要增加一个新的怪物——雷鸟(CThunderBird)。如何编程才能使升级时的代码改动和增加量最小?
- 基本思路
非多态的实现方法
class CCreature {protected:int nPower; // 代表攻击力int nLifeValue; // 代表生命值};class CDragon:public CCreature {public:void Attack(CWolf * pWolf) {// ... 表现攻击动作的代码pWolf->Hurted(nPower);pWolf->FightBack(this);}void Attack(CGhost * pGhost) {// ... 表现攻击动作的代码pGhost->Hurted(nPower);pGhost->FightBack(this);}// ...对每一个其他类,写一个attackvoid Hurted(int nPower) {// ... 表现受伤动作nLifeValue -= nPower;}void FightBack(CWolf* pWolf) {// ... 表现反击动作pWolf->Hurted(nPower / 2);}// ... 对每一个其他类,写一个fightback};
有n种关务,CDragon类中就会有n个Attack成员函数,以及n个FightBack成员函数,其他类也如此
非多态实现的缺点
-
多态的实现方法
class CCreature {protected:int m_nLifeValue, m_nPower;public:virtual void Attack(CCreature * pCreature) {}virtual void Hurted(int nPower) {}virtual void FightBacj(CCreature * pCreature) {}};class CDragon:public CCreature {public:virtual void Attack(CCreature * pCreature);virtual void Attack(CCreature * pCreature);virtual void Attack(CCreature * pCreature);};void CDragon::Attack(CCreature * p) {// ... 表现攻击动作p->Hurted(m_nPower); // 多态p->FightBack(this); // 多态}void CDragon::Hurted(int nPower) {// ... 表现手上动作的代码m_nLifeValue -= nPower;}void CDragon::FightBack(CCreature* p) {// ... 表现反击动作p->Hurted(m_nPower / 2); // 多态}
多态实现的优势
如果编写新类CThunderBird,已有的类可以原封不动呀!

