描述一下
游戏版本升级的时候,需要增加一个新的怪物——雷鸟(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);
}
// ...对每一个其他类,写一个attack
void 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,已有的类可以原封不动呀!