• iOS开发-OC语言 (七)继承、多态、类别


     继承、多态、类别

    学习目标

    1、继承的含义

    2、父类子类的别称

    3、字段和消息的继承

    4、重写和重写消息的调用

    5、多态

    6、类别(Category)

    =============================================

    1.需要理解的知识

    面向对象的三个基本特征:   1、封装 2、继承 3、多态

    1、继承(单继承):    父类(超类)和子类的关系。

           继承的两个类,存在父子关系。

         OC支持单继承,不支持多继承。

          

    1.1 生活中的继承

                     人(父类) ——  男人/女人(子类)

                    男人/女人(父类) ———  学生(子类)

                   学生(父类)——— 大学生(子类)

                 大学生(父类) ———  大四学生(子类)

                 大四学生(父类)——— 小明(子类)

    【注】

    (1)把继承又叫做派生

    父类的属性(成员变量(不包括私有))和方法,子类可以直接获取,这个过程就叫做继承

    子类在父类的基础上,创建了自己独有的成员变量和方法,这个过程就叫做派生。

    继承和派生其实是说的继承概念的不同的侧重点。

          (2)提示:每个类中都有一个super class指针,该指针指向自己的父类。对象中有一个isa指针,该指针指向调用该对象的类。

        继承的好处:

      1)创建大量的相似类的时候,可以节省工作量。抽取出了重复的代码

      2)使用框架中的类,或已经写好的类,继承该类,生成一个派生类,比原类更好用。

    注意:NSString、NSArray、NSDictionary都是不能够继承的。

           3)建立了类和类之间的联系

          继承的缺点:

                耦合性太强

     NSString不能被继承的原因:

               NSString这个类在设计的时候采用了“抽象工厂”模式,内部是个class cluster,一个类簇。也就是说NSString是个“工厂类”,然后它在外层提供了很多方法接口,但是这些方法的实现是由具体的内部类来实现的。当使用NSString生成一个对象时,初始化方法会判断哪个“自己内部的类”最适合生成这个对象,然后这个“工厂”就会生成这个具体的类对象返回给你。这种又外层类提供统一抽象的接口,然后具体实现让隐藏的,具体的内部类来实现。

      1.2 代码中的继承

    <1>继承的基本语法

    (1)@interface 子类名:父类名

    @end

    (2)继承之后

    子类可以使用父类的所有共有方法  

    子类可以获得父类非私有的成员变量

    <2>重写

    1.子类从父类继承的方法, 有时候不适合子类,子类可以重写这个方法

    2.重写就是重新实现一遍父类的方法(方法名一样 ,实现内容不同)

    3.子类重写父类方法之后,子类对象最终执行的是子类重写之后的方法

    1.3 继承在内存中的体现

    子类继承父类之后。 子类对象的构成:

    1) 父类的字段和方法

    2) 子类自己独有的字段和方法

    【继承的作用】

    1、快速创建多个形似的类

    2、对类进行扩展

    3、自定义一些系统的一些功能控件(UI里面用的比较多)

    【重写】有时候从父类继承到的方法,并不适合子类,子类可以重写这个方法。

    【重写是多态的一种,多态就是同一个声明不同的实现】

    【注】很多时候,子类的方法只需要在父类的同名方法中增补些内容。可以通过关键字【supper】调用父类的方法,再增添子类独有的内容。

            1.4 关键字super

    Super关键字,在子类中重写方法时,可以让调用者跳过这一层而调用父类中的方法。

    作用:

    (1)直接调用父类中的某一个方法

    (2)Super处在对象方法中,那么就会调用父类的对象方法;super处于类方法中,那么就会调用父类的类方法。

    使用场景:子类在重写父类方法时,想要保留父类的一些行为。

             1.5 继承和组合

    继承的适用场合:

    (1)当两个类拥有相同的属性和方法时,就可以将相同的属性和方法抽取到一个父类中。

    (2)当A类完全拥有B类中的部分属性和方法时,可以考虑让B类继承A类(考虑),在这种情况下,也可以考虑使用组合。

    继承:###是xxx,如狗是动物,可以让狗继承动物类

    组合###拥有xxx,如学生有书,可以让书这个类作为学生类的属性

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

    2、多态与类的消息机制 

    【多态】重写、虚函数 

    //其实多态就是指,同一个接口不同的实现

    同一个方法,不同的实现,称为多态。重写是多态的一种。

            

             方法重载也是多态的一种。方法重载是指在一个类中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的个数。

      【注意】OC没有严格的方法重载。

    【虚方法】

                虚函数定义:调用方法时,不看指针,看对象,对象的地址指向什么对象,就调用什么方法,称为虚方法。

                虚方法的好处:可以描述不同事物被相同事件触发,产生不同的响应(结果)

    1.响应消息,不看指针,看对象。

    2.父类的指针,可以指向子类的对象(子类的对象赋值给父类)。

    【注】

    虚方法体现了不同事物被同一事件触发,有不同的响应。

    给不同对象发送相同的消息,反应不一样。

    实现多态(满足三个条件)

    1、有继承关系

    2、有重写

    3、父类的指针指向了子类的对象

    【注】NSString NSArray NSDictionary NSNumber 都是【工厂类】或者是抽象类,不能被继承,即使被继承,也不能使用父类的方法。

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

    5、类别/类目   category

              类别的写法:

              @interface 类名 (类别名)

         定义方法

    @end

            如何给一个类扩展方法?

    1、继承

    2、类别

      注:一旦使用类别给已有的类增补方法,那么这个类的对象就可以使用这个方法

    <2>.类别功能:

      1. 可以给已有/ 系统原生的类增加方法,不能添加全局变量和属性。

      2.可以对类的方法进行分类管理,可以将类的实现分散到多个不同文件或多个不同框架中。

    <3>使用类别需要注意的问题

    1.类别中不能添加成员变量

    2.使用类别增加的方法须导入类别头文件

    3.父类类别中的方法,子类也可以用

    <4>类扩展

    当不想对外公开一些类的方法时,我们可以使用类扩展

    1.类扩展的基本语法

    在.m文件中

    @interface Person()//没有名字

      - (void)song;

    @end

    @implementation Person

    - (void)song{

    }

    @end

    注: 类扩展中的声明和实现都放在.m文件中

        2.类扩展的功能

    1.可以实现私有方法

    2.可以声明成员变量 ,成员变量是私有的,子类和其他类访问不了。

  • 相关阅读:
    「Luogu2397」 yyy loves Maths VI (mode)
    「Luogu2014」 选课
    「Luogu2972」 [USACO10HOL]岩石和树木Rocks and Trees
    中国剩余定理
    点双连通分量
    Miller_Rabin大质数检验
    manachaer算法
    Kruskal重构树
    世界,你好!
    [Luogu P1450] [HAOI2008]硬币购物 背包DP+容斥
  • 原文地址:https://www.cnblogs.com/fcug/p/6286490.html
Copyright © 2020-2023  润新知