年年有"余"

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2294|回复: 1

多态的基本介绍

[复制链接]
  • TA的每日心情

    2024-10-15 10:05
  • 签到天数: 372 天

    [LV.9]以坛为家II

    发表于 2014-3-13 12:05:04 | 显示全部楼层 |阅读模式
    同样,我们用一个示例来说明一下,说明写在代码注释中:
    1. /*
    2. 多态的基本介绍及应用场景
    3. 1.什么叫多态?
    4.     多态即父类的指针,指向子类的对象;
    5. */
    6. #import <Foundation/Foundation.h>
    7. /*******创建一个动物类做为父类*******/
    8. @interface Animal : NSObject {
    9. }  // 简化一下,没有成员变量
    10. - (void)eat;  // 声明一个吃的方法
    11. @end
    12. @implementation Animal
    13. //简单实现吃的方法
    14. - (void)eat {
    15.     NSLog(@"Animal is eating...");
    16. }
    17. @end
    18. /********创建一个狗的类**********/
    19. @interface Dog : Animal {  // 继承动物类
    20. }
    21. @end
    22. @implementation Dog
    23. // 重写吃方法
    24. - (void)eat {
    25.     NSLog(@"Dog is eating...");
    26. }
    27. @end
    28. /********创建一个猫的类********/
    29. @interface Cat : Animal {  // 继承动物类
    30. }
    31. @end
    32. @implementation Cat
    33. // 重写吃方法
    34. - (void)eat {
    35.     NSLog(@"Cat is eating...");
    36. }
    37. @end
    38. /********三个类的创建与声明实现结束********/
    39. /*创建一个函数,用来喂养动物
    40. 1、关键在于函数的形参类型,如果是(Dog *)则只能喂狗,如果是(Cat *)则只能喂猫
    41. 2、如果是(Animal *)则只能喂动物,但狗和猫都是动物类的子类,多态在这里体现出来
    42. 3、形参类型是(Animal *),如果把狗的对象传进去,等同于Animal *a = [Dog new]
    43. 4、正常情况下我们创建一个狗的对象应该是Dog *d = [Dog new],两者的区别在于指针类型
    44. 5、父类的指针指向了子类的对象,这就是所谓的多态
    45. 6、通过多态,可以实现void feed(Animal *a)即能喂猫又能喂狗
    46. */
    47. void feed(Animal *a) {
    48.     [a eat];  // 调用对象的吃方法
    49. }
    50. int main() {
    51.     Dog *dog = [Dog new];  // 可以写成Animal *dog = [Dog new];
    52.     feed(dog);
    53.     Cat *cat = [Cat new];  // 可写成Animal *cat = [Cat new];
    54.     feed(cat);
    55.    
    56.     Animal * animal = [Animal new];
    57.     feed(animal);
    58.    
    59.     return 0;
    60. }
    复制代码
    运行结果:
    2014-03-13 12:02:42.260 a.out[1276:507] Dog is eating...
    2014-03-13 12:02:42.262 a.out[1276:507] Cat is eating...
    2014-03-13 12:02:42.263 a.out[1276:507] Animal is eating...


  • TA的每日心情

    2024-10-15 10:05
  • 签到天数: 372 天

    [LV.9]以坛为家II

     楼主| 发表于 2014-3-13 12:19:57 | 显示全部楼层
    本帖最后由 Sian 于 2014-3-13 12:21 编辑

    补充说明一下:
    1、多态存在一定的局限性,比如说父类中如果没有eat方法,则不参直接这样使用;
    2、父类类型变量不能直接调用子类特有的方法
    3、如果强制使用,需要转换类型,如:Animal *a = [Dog new]编译器会发出警告,解决办法:Dog *d = (Dog *)a; 类似int a = (int)3.14;4、OC弱语法类型,在方法调用时会动态检测,因此编译会发出警告,但实际链接运行可正常执行
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    手机版|小黑屋|Archiver|iOS开发笔记 ( 湘ICP备14010846号 )

    GMT+8, 2024-11-22 12:59 , Processed in 0.049881 second(s), 23 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表