• 【学习笔记】【OC语言】多态


    1.多态的基本概念
    某一类事物的多种形态
    OC对象具有多态性

    2.多态的体现
    Person *p = [Student new];
    p->age = 100;
    [p walk];
    子类对象赋值给父类指针
    父类指针访问对应的属性和方法

    3.多态的好处
    用父类接收参数,节省代码

    4.多态的局限性
    不能访问子类的属性(可以考虑强制转换)

    5.多态的细节
    动态绑定:在运行时根据对象的类型确定动态调用的方法

    6.代码

      1 #import <Foundation/Foundation.h>
      2 
      3 /*
      4  多态
      5  1.没有继承就没有多态
      6  2.代码的体现:父类类型的指针指向子类对象
      7  3.好处:如果函数方法参数中使用的是父类类型,可以传入父类、子类对象
      8  4.局限性:
      9  1> 父类类型的变量 不能 直接调用子类特有的方法。必须强转为子类类型变量后,才能直接调用子类特有的方法
     10  */
     11 
     12 // 动物
     13 @interface Animal : NSObject
     14 - (void)eat;
     15 @end
     16 
     17 @implementation Animal
     18 - (void)eat
     19 {
     20     NSLog(@"Animal-吃东西----");
     21 }
     22 @end
     23 
     24 //
     25 @interface Dog : Animal
     26 - (void)run;
     27 @end
     28 
     29 @implementation  Dog
     30 - (void)run
     31 {
     32     NSLog(@"Dog---跑起来");
     33 }
     34 - (void)eat
     35 {
     36     NSLog(@"Dog-吃东西----");
     37 }
     38 @end
     39 
     40 //
     41 @interface Cat : Animal
     42 
     43 @end
     44 
     45 @implementation Cat
     46 - (void)eat
     47 {
     48     NSLog(@"Cat-吃东西----");
     49 }
     50 @end
     51 
     52 // 这个函数是专门用来喂动画
     53 //void feed(Dog *d)
     54 //{
     55 //    [d eat];
     56 //}
     57 //
     58 //void feed2(Cat *c)
     59 //{
     60 //    [c eat];
     61 //}
     62 //
     63 
     64 // 如果参数中使用的是父类类型,可以传入父类、子类对象
     65 void feed(Animal *a)
     66 {
     67     [a eat];
     68 }
     69 
     70 int main()
     71 {
     72     // NSString *d = [Cat new];
     73     // [d eat];
     74     
     75     /*
     76     Animal *aa = [Dog new];
     77     // 多态的局限性:父类类型的变量 不能 用来调用子类的方法
     78     //[aa run];
     79     
     80     // 将aa转为Dog *类型的变量
     81     Dog *dd = (Dog *)aa;
     82     
     83     [dd run];
     84     */
     85     
     86     //Dog *d = [Dog new];
     87     
     88     //[d run];
     89     
     90     /*
     91     Animal *aa = [Animal new];
     92     feed(aa);
     93     
     94     Dog *dd = [Dog new];
     95     feed(dd);
     96     
     97     Cat *cc = [Cat new];
     98     feed(cc);
     99      */
    100     
    101     /*
    102     // NSString *s = [Cat new];
    103     Animal *c = [Cat new];
    104     
    105     
    106     NSObject *n = [Dog new];
    107     NSObject *n2 = [Animal new];
    108     
    109     
    110     // 多种形态
    111     //Dog *d = [Dog new]; // Dog类型
    112     
    113     // 多态:父类指针指向子类对象
    114     Animal *a = [Dog new];
    115     
    116     // 调用方法时会检测对象的真实形象
    117     [a eat];
    118     */
    119     return 0;
    120 }
     
  • 相关阅读:
    MySQL 日志管理
    nginx 日志分割
    Canvas 动态小球重叠效果
    Canvas制作动态进度加载水球
    js 多张爆炸效果轮播图
    js 多张图片加载 环形进度条
    INSTALL_FAILED_CONFLICTING_PROVIDER
    安卓 文件管理器 各种应用 源码
    android 静音
    android studio 查看大纲
  • 原文地址:https://www.cnblogs.com/dssf/p/4652283.html
Copyright © 2020-2023  润新知