描述一下

image.png
image.png
游戏版本升级的时候,需要增加一个新的怪物——雷鸟(CThunderBird)。如何编程才能使升级时的代码改动和增加量最小?

  • 基本思路

image.png
image.png

非多态的实现方法

  1. class CCreature {
  2. protected:
  3. int nPower; // 代表攻击力
  4. int nLifeValue; // 代表生命值
  5. };
  6. class CDragon:public CCreature {
  7. public:
  8. void Attack(CWolf * pWolf) {
  9. // ... 表现攻击动作的代码
  10. pWolf->Hurted(nPower);
  11. pWolf->FightBack(this);
  12. }
  13. void Attack(CGhost * pGhost) {
  14. // ... 表现攻击动作的代码
  15. pGhost->Hurted(nPower);
  16. pGhost->FightBack(this);
  17. }
  18. // ...对每一个其他类,写一个attack
  19. void Hurted(int nPower) {
  20. // ... 表现受伤动作
  21. nLifeValue -= nPower;
  22. }
  23. void FightBack(CWolf* pWolf) {
  24. // ... 表现反击动作
  25. pWolf->Hurted(nPower / 2);
  26. }
  27. // ... 对每一个其他类,写一个fightback
  28. };
  • n种关务,CDragon类中就会有nAttack成员函数,以及nFightBack成员函数,其他类也如此

    非多态实现的缺点

  • 如果添加了新的怪物雷鸟,则程序改动较大

    多态的实现方法

    1. class CCreature {
    2. protected:
    3. int m_nLifeValue, m_nPower;
    4. public:
    5. virtual void Attack(CCreature * pCreature) {}
    6. virtual void Hurted(int nPower) {}
    7. virtual void FightBacj(CCreature * pCreature) {}
    8. };
    9. class CDragon:public CCreature {
    10. public:
    11. virtual void Attack(CCreature * pCreature);
    12. virtual void Attack(CCreature * pCreature);
    13. virtual void Attack(CCreature * pCreature);
    14. };
    15. void CDragon::Attack(CCreature * p) {
    16. // ... 表现攻击动作
    17. p->Hurted(m_nPower); // 多态
    18. p->FightBack(this); // 多态
    19. }
    20. void CDragon::Hurted(int nPower) {
    21. // ... 表现手上动作的代码
    22. m_nLifeValue -= nPower;
    23. }
    24. void CDragon::FightBack(CCreature* p) {
    25. // ... 表现反击动作
    26. p->Hurted(m_nPower / 2); // 多态
    27. }

    多态实现的优势

  • 如果编写新类CThunderBird,已有的类可以原封不动呀!