美文网首页八天学会OC
第03天OC语言(11):多态

第03天OC语言(11):多态

作者: liyuhong | 来源:发表于2017-07-20 16:10 被阅读9次
    • 不要等到明天,明天太遥远,今天就行动。
    须读:看完该文章你能做什么?

    什么是多态

    学习前:你必须会什么?(在这里我已经默认你具备C语言的基础了)

    什么类、什么继承


    一、本章笔记
     什么是多态
        某一类事物的多种形态
        猫 ->猫->动物
        狗 ->狗->动物
        男人 男人->人->高级动物
        女人 女人->人->高级动物
        
     程序中如何表示
        父类指针 指向 子类对象
        动物的指针 指向了 猫 (这就是多态) 猫是动物
        动物 *a = [猫 new];
     例子:
          动态类型 : 在编译的时候 编译只会检查 当前类型中对应的类中 有没有需要调用的方法 (也就是说command+B编译的时候 会去检查Anima 有没有eat方法)
                   在运行时, 系统会自动判断a1的真实类型 (也就是说 当运行的时候 a1已经是Dog类型了 所以会去执行Dog类里面的eat方法)
         Anima *a1 = [Dog new];
         [a1 eat];
     优点: 
        提高代码的扩展性 (比如人 要喂动物 猫\狗\猪) 1>那么所有的动物都集成Anima 2>人提供一个喂动物的方法(调用动物eat方法) 3>动物都重写eat方法
         Dog *d = [Dog new];
         [Person foodAnima:d];
         Cat *c = [Cat new];
         [Person foodAnima:c];
         Pig *p = [Pig new];
         [Person foodAnima:p];
     注意点: 
        如果父类指针指向子类对象, 如果需要调用子类特有的方法,必须强制类型转换 为子类 才能调用
        Anima *a1 = [Dog new];
        // kanjia 是Dog的方法
        强制转换方式1
         Dog *d1 = (Dog *)a1;
         [d1 kanjia];
        强制转换方式2
        [(Dog *)a1 kanjia];
    
    二、code
    main.m
    #pragma mark 11-多态
    
    #pragma mark - 代码
    #import <Foundation/Foundation.h>
    #pragma mark 类
    
    #import "Cat.h"
    #import "Dog.h"
    #import "Pig.h"
    #import "Person.h"
    
    #pragma mark - main函数
    int main(int argc, const char * argv[])
    {
        /*
        Dog *d = [Dog new];
        [d eat];
        Cat *c = [Cat new];
        [c eat];
        */
        
    #pragma mark 多态
        /*
        // 多态 : 事物的多种表现形态
        // 动态类型 : 在编译的时候 编译只会检查 当前类型中对应的类中 有没有需要调用的方法 (也就是说command+B编译的时候 会去检查Anima 有没有eat方法)
        //          在运行时, 系统会自动判断a1的真实类型 (也就是说 当运行的时候 a1已经是Dog类型了 所以会去执行Dog类里面的eat方法)
        Anima *a1 = [Dog new];
        [a1 eat];
        
        // 注意点, 在多态中, 如果想调用 子类特有的方法 必须强调类型 转换为 子类才能调用
        // [a1 kanjia]; // 错误写法 编译时报错
    //    Dog *d1 = (Dog *)a1;
    //    [d1 kanjia];
        [(Dog *)a1 kanjia];
         */
        
        
        Dog *d = [Dog new];
    //    [Person food:d];
        [Person foodAnima:d];
        
        Cat *c = [Cat new];
    //    [Person foodCat:c];
        [Person foodAnima:c];
        
        Pig *p = [Pig new];
        [Person foodAnima:p];
        
        return 0;
    }
    
    
    Person
    >>>.h
    #import <Foundation/Foundation.h>
    #import "Dog.h"
    #import "Cat.h"
    #import "Anima.h"
    @interface Person : NSObject
    //+ (void)food:(Dog *)d;
    //+ (void)foodCat:(Cat *)c;
    
    // 动物园
    // 猴子\大象\孔雀
    // 喂动物
    + (void)foodAnima:(Anima *)a;
    @end
    
    >>>.m
    @implementation Person
    //+ (void)food:(Dog *)d
    //{
    //    NSLog(@"喂狗");
    //}
    //+ (void)foodCat:(Cat *)c
    //{
    //    NSLog(@"喂猫");
    //}
    
    + (void)foodAnima:(Anima *)a
    {
        [a eat];
    }
    @end
    
    
    Anima
    >>>.h
    #import <Foundation/Foundation.h>
    
    @interface Anima : NSObject
    {
        int _age;
    }
    - (void)eat;
    @end
    >>>.m
    #import "Anima.h"
    
    @implementation Anima
    - (void)eat
    {
        NSLog(@"啃骨头");
    }
    @end
    
    Dog
    >>>.h
    #import <Foundation/Foundation.h>
    #import "Anima.h"
    @interface Dog : Anima
    - (void)kanjia;
    @end
    
    >>>.m
    @implementation Dog
    - (void)eat
    {
        NSLog(@"啃骨头");
    }
    - (void)kanjia
    {
        NSLog(@"看家");
    }
    @end
    
    Cat
    >>>.h
    #import <Foundation/Foundation.h>
    #import "Anima.h"
    @interface Cat : Anima
    
    - (void)eat;
    
    @end
    >>>.m
    #import "Cat.h"
    
    @implementation Cat
    - (void)eat
    {
        NSLog(@"吃鱼");
    }
    @end
    
    Pig
    >>>.h
    #import <Foundation/Foundation.h>
    #import "Anima.h"
    @interface Pig : Anima
    
    @end
    >>>.m
    #import "Pig.h"
    
    @implementation Pig
    - (void)eat
    {
        NSLog(@"大口吃");
    }
    @end
    

    image.png

    相关文章

      网友评论

        本文标题:第03天OC语言(11):多态

        本文链接:https://www.haomeiwen.com/subject/wxwvhxtx.html