黑马程序员技术交流社区

标题: OC多态的理解 [打印本页]

作者: xiniuniu    时间: 2014-8-17 17:43
标题: OC多态的理解



     多态,就是用最少的代码实现多种状态, 而这些状态在编译时是无法确定,直到程序运行中才会最终确定下来。如比我们开发一款游戏,游戏人物有多种武器装备可供使用。不同的武器装备使用相同的攻击技能,但产生的效果确不相同(比如攻击力,视觉效果等等)。也就是游戏人物调用武器的攻击方法。我们是无法知道玩家当时会选择使用哪种武器进行游戏。那就声明一个武器类指针指向武器子类。这时指向哪种武器子类就会调用哪种武器子类的方法。这就是多态。

多态实现的几个条件:
1. 多态存在的前提是必须要有继承
2.父类类型指针指向子类对象
3.但多态有一个局限性就是不能调用子类特有的方法

  1. #import <Foundation/Foundation.h>
  2. #include <stdio.h>

  3. /********************* Weapon *************************/
  4. @interface Weapon : NSObject
  5. - (void)attack;

  6. @end

  7. @implementation Weapon

  8. - (void)attack
  9. {
  10.     NSLog(@"攻击力一般。效果一般");
  11. }
  12. @end

  13. /********************* Sword *************************/
  14. @interface Sword : Weapon
  15. - (void)attack;
  16. @end
  17. @implementation Sword

  18. - (void)attack
  19. {
  20.     NSLog(@"攻击力120, 效果:亮眼");
  21. }
  22. @end

  23. /********************* Gun *************************/

  24. @interface Gun : Weapon
  25. - (void)attack;
  26. @end
  27. @implementation Gun

  28. - (void)attack
  29. {
  30.     NSLog(@"攻击力200, 效果:无法直视");
  31. }

  32. @end

  33. /********************* Player *************************/
  34. @interface Player : NSObject
  35. - (void)useWeapon:(Weapon*)arms;
  36. @end

  37. @implementation Player

  38. - (void)useWeapon:(Weapon *)arms
  39. {
  40.     [arms attack];
  41. }
  42. @end


  43. int main(int argc, const char * argv[])
  44. {
  45.     Player *merry = [Player new];
  46.     Weapon *arms = [Weapon new];
  47.     Sword *bigSword = [Sword new];
  48.     Gun *bigGun = [Gun new];
  49.    
  50.     int choise = 0;
  51.     NSLog(@"使用大剑请输入1 , 使用大大枪请输入2");
  52.     scanf("%d", &choise);
  53.    
  54.     switch (choise)
  55.     {
  56.         case 1:
  57.             [merry useWeapon:bigSword];
  58.             break;
  59.         case 2:
  60.             [merry useWeapon:bigGun];
  61.             break;
  62.         default:
  63.             [merry useWeapon:arms];
  64.             break;
  65.     }
  66.    
  67.     return 0;
  68. }
复制代码




作者: 3677065    时间: 2014-8-19 22:54
我的理解还停留在父类指针指向子类
作者: ixx__123    时间: 2014-8-22 15:42
        今天复习了下多态   




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2