• Objective-C 【多态】


    ———————————————————————————————————————————
    多态的概念、实现以及注意事项

    程序中的多态:不同的对象    以自己的方式去    响应   相同方法名(父类同名的方法)   的能力称为多态。

    多态的条件:有继承关系、有方法的重写(对应上面一条“以自己的方式”)
                  用父类类型的指针指向了子类对象

    代码体现:用父类类型的指针指向了子类对象,这就是多态

    狗 *g=[狗 new];

    动物 *g=[狗 new]; (动物类的指针指向了狗类新声明的实例对象)


    多态的优点:多态的好处就是    简化了编程接口,它容许   在类和类之间重用一些习惯性的命名。而不用为每一个新加的函数命名一个新名字。这样编程借口就是一些抽象的行为的集合,从而实现接口的类区分开来。


    一段代码:

    #import <Foundation/Foundation.h>

    @interface Animal : NSObject
    -(void)run;
    @end

    @interface Dog : Animal
    -(void)eat;
    @end

    @interface Cat : Animal

    @end

    @interface BigYellowDog : Dog

    @end

    @implementation Animal
    -(void)run
    {
        NSLog(@"Animal run!");
    }
    @end

    @implementation Dog
    -(void)run
    {
        NSLog(@"Dog run!");
    }
    -(void)eat
    {
        NSLog(@"Dog eat!");
    }
    @end

    @implementation Cat
    -(void)run
    {
        NSLog(@"Cat run!");
    }
    @end

    @implementation BigYellowDog
    -(void)run
    {
        NSLog(@"BYDog run!");
    }
    @end

    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            Animal *a1=[BigYellowDog new];//BigYellowDog虽然不是Animal的子类,但是他的父类的父类是Animal类,所以BigYellowDog也是继承了Animal类,可以重写Animal的方法
            [a1 run];
            
            Animal *a2=[Dog new];
            [a2 run];
            
            Animal *a3=[Cat new];
            [a3 run];
            
            Animal *a4=[Animal new];
            [a4 run];
    //      以上四个实例对象,直到执行时才能确定对象的所属类型
    //      直到执行时才能确定对象调用的实际方法
    //      OC不同于传统设计语言,他可以在运行时加入新的数据类型和新的程序模块:动态类型识别,动态绑定,动态加载
     
            
    //        那么,父类能不能调用子类特有的方法呢?(不是继承父类的方法)
            Animal *a5=[Dog new];
    //        [a5 eat]; //这样写是不对的,编译的时候会报错。(虽然说我们知道a5就是Dog类型的,但是需要在执行/运行的过程中我们才会知道他是一个什么类型,现在我们只是知道a5是一个Animal类型,所以这里会编译出错)
            
            [(Dog *)a5 eat];//如果要让父类非要访问子类特有方法,那么应该使用强制类型转换。(这里为什么说是父类访问子类呢,因为我们声明的时候系统还是认为这个实例对象是属于父类的,而真正作为子类对象是在执行过程中系统才认定的,所以说在编译的时候系统并不认为他是子类的)
            
    //        那么,这样会不会正确访问呢?
            Animal *a6=[Animal new];
    //        [(Dog *)a6 eat]; //这样调用显然是错误的,我们虽然强制类型转换了,但是我们只是在编译的时候骗了编译器而已,他实际上在骨子里还是父类的实例对象,父类是没有eat这个方法的,强制类型转换也得看能不能转才行。虽然编译不会报错,但是运行就会出错了。
        }
        return 0;
    }


    ———————————————————————————————————————————

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    cocos2d-x于android在call to OpenGL ES API with no current context
    C# 6.0 (C# vNext) 的新功能:Exception-Handling Improvements
    既然知识都会遗忘,我们为什么要学习?
    进程(线程)间通信与网络通信的联系与比较
    网络通信要素与总结
    android和IOS长连接区别
    TCP socket如何判断连接断开
    application/json 四种常见的 POST 提交数据方式
    TCP和流
    比勤奋更重要的,是深度思考的能力
  • 原文地址:https://www.cnblogs.com/wzy294250051/p/4787894.html
Copyright © 2020-2023  润新知