继承、多态、类别

学习目标

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.可以声明成员变量 ,成员变量是私有的,子类和其他类访问不了。

iOS开发-OC语言 (七)继承、多态、类别的更多相关文章

  1. iOS开发-OC语言 (一)oc数据类型

    分享一套以前学习iOS开发时学习整理的资料,后面整套持续更新: oc数据类型 数据类型:基本数据类型.指针数据类型 基本数据类型:数值型.字符型(char).布尔型.空类型(void) 指针数据类型: ...

  2. iOS开发-OC语言 (四)数组

    知识点 1.NSArray 2.NSMutableArray 1.数组的基本用法: 2.数组的遍历 3.数组排序 ===========   NSArray  不可变数组  ============= ...

  3. iOS开发-OC语言 (三)字符串

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; text-align: center; font: 24.0px "PingFang SC" } p ...

  4. iOS开发-OC语言 (二)类的设计

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 24.0px Helvetica } p.p2 { margin: 0.0px 0.0px 0.0px 0. ...

  5. iOS开发-OC语言 (五)字典

    字典 主要知识点: 1.NSDictionary 类 2.NSMutableDictionary 类 3.了解NSMutableDictionary 与 NSDictionary 的继承关系 4.补充 ...

  6. iOS开发-OC语言 (六)点语法和@property

    点语法和@property 知识点 1.setter/getter函数 2.点语法 3.@property语法和属性 ======================================== ...

  7. iOS开发OC基础:Xcode中常见英文总结,OC常见英文错误

    在开发的过程中难免会遇到很多的错误,可是当看到系统给出的英文时,又不知道是什么意思.所以这篇文章总结了Xcode中常见的一些英文单词及词组,可以帮助初学的人快速了解给出的提示.多练习,就肯定能基本掌握 ...

  8. Android与Swift iOS开发:语言与框架对比

    Swift是现在Apple主推的语言,2014年新推出的语言,比Scala等“新”语言还要年轻10岁.2015年秋已经开源.目前在linux上可用,最近已经支持Android NDK:在树莓派上有Sw ...

  9. Android &Swift iOS开发:语言与框架对比

    转载自:http://www.infoq.com/cn/articles/from-android-to-swift-ios?utm_campaign=rightbar_v2&utm_sour ...

随机推荐

  1. 慧都十年大促起幕,Dev、BCG等明星控件6.8折起!

    2013慧都十周年大促正式起幕,DevExpress.BCGControlBar.FastReport.TeeChart等精选明星控件Top 10悉数"价"到,还有更多产品惊喜&q ...

  2. .NET MVC4 实训记录之一(引入Unity3.0 Ioc框架)

    一直在做维护项目,没有机会接触完整的架构,于是自学.NET MVC.自今日起,将自学的过程.遇到的问题以及解决方案记录下来. 在WebApp项目中右键,使用NuGet引入Unity3.0.

  3. 有关Android存储的相关概念辨析

    我想念许多Android开发人员在碰到有关存储的相关问题时,肯定遇到过“内部存储/内存”.“外部存储/外存”等类似的概念,尤其是将相关概念跟非开发人员解释时,那真是“秀才遇到兵,有理说不清哪”.包括我 ...

  4. JAVA 作业:图形界面

    自己动手写的一个小JAVA 程序: 一个学生管理小系统,虽然很挫,但是这我学JAVA的第一步.学了2天JAVA没有白费! import java.awt.*; import java.awt.even ...

  5. 测试驱动 ASP.NET MVC 和构建可测试 ASP.NET MVC 应用程序

    [测试驱动 ASP.NET MVC] http://t.cn/8kdi4Wl [构建可测试 ASP.NET MVC 应用程序]http://t.cn/8kdi4Wj

  6. Dynamics CRM 2013 体验

    CRM 2013终于可以下载了,赶紧下载安装. 在CRM 2011 的基础上,CRM 2013 在UI上有了很大的变化.从CRM 2011 RollUp 12开始,微软就放弃了按钮的立体效果,逐渐趋向 ...

  7. -协同IResult

    Caliburn.Micro学习笔记(五)----协同IResult   今天说一下协同IResult 看一下IResult接口 /// <summary> /// Allows cust ...

  8. Python日期操作

    1. 日期输出格式化 所有日期.时间的api都在datetime模块内. 1. datetime => string now = datetime.datetime.now() now.strf ...

  9. VS调试技巧与快捷键&&VS快捷键

    VS调试技巧与调试快捷键 1.添加断点或取消断点:F9(或者点击代码行最左边的灰色行)   2.调试:F10逐过程(不进入函数内部,直接获取函数运行结果)  F11逐语句(会进入函数),如果想跳出函数 ...

  10. Prolog学习:基本概念 and Asp.net与Dojo交互:仪器仪表实现

    Asp.net与Dojo交互:仪器仪表实现 项目中需要用到仪器仪表的界面来显示实时的采集信息值,于是便遍地寻找,参考了fusionchart和anychart之后,发现都是收费的,破解的又没有这些功能 ...