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.可以声明成员变量 ,成员变量是私有的,子类和其他类访问不了。
转载于:https://www.cnblogs.com/fcug/p/6286490.html
iOS开发-OC语言 (七)继承、多态、类别相关推荐
- 从Java/Android到Swift iOS开发:语言与框架对比
今天分享的主题是Java/Android开发人员如何快速上手Swift iOS开发.主要内容如下: WhyFrom Java/Android to Swift Swift语言为什么值得学习? Java ...
- iOS开发Swift语言学习教程-欧阳坚-专题视频课程
iOS开发Swift语言学习教程-16345人已学习 课程介绍 Swift这套视频是针对有Objective-C/iOS基础,想转成Swift开发的学习视频,视频中从Swift语法,结 ...
- 系列:iOS开发-C语言基础
#系列:iOS开发-C语言基础 之前也说了iOS中的OC是扩充C的面向对象编程语言 那么无论是从什么角度来说都要首先回顾一下C的内容,虽然很多人在大学的时候都有学习过C语言,一提到谭浩强,我估计90% ...
- Android与Swift iOS开发:语言与框架对比
Swift是现在Apple主推的语言,2014年新推出的语言,比 Scala等"新"语言还要年轻10岁.2015年秋已经开源.目前在linux上可用,最近已经支持Android N ...
- Android Swift iOS开发:语言与框架对比
转载自:http://www.infoq.com/cn/articles/from-android-to-swift-ios?utm_campaign=rightbar_v2&utm_sour ...
- ios开发语言在c语言的基础上,iOS开发 - C语言基础4(基本语句和运算符) - 猫扑天空...
iOS开发 - C语言基础4(基本语句和运算符) 基本语句 C语言的基本语句跟Java中的差不多,所以,这里只是简单地提一下 循环语句(do while.while.for) 条件语句(if .if- ...
- ios c语言头文件,iOS开发 -- C语言基础12(预处理指令)
iOS开发 -- C语言基础12(预处理指令) 宏定义 预处理指令简介 1.C语言在对源程序进行编译之前,会先对一些特殊的预处理指令作解释(比如之前使用的#include文件包含指令),产生一个新的源 ...
- 李洪强漫谈iOS开发[C语言-038]-if else if语句
李洪强漫谈iOS开发[C语言-038]-if else if语句
- ios开发oc高仿京东金融白条额度余额的 ios开发水波纹 ios开发水正弦曲线波纹 ios开发雷达扫描的动画效果
ios开发oc高仿京东金融白条额度余额的 ios开发水波纹 ios开发水正弦曲线波纹 直接上代码,复制粘贴就可以 vc里的 WaterRippleView *topView = [[Water ...
- ios开发oc高仿京东金融白条额度余额的 ios开发水波纹 ios开发水正弦曲线波纹 ios开发雷达扫描的动画效果...
ios开发oc高仿京东金融白条额度余额的 ios开发水波纹 ios开发水正弦曲线波纹 直接上代码,复制粘贴就可以 vc里的 WaterRippleView *topView = [[Water ...
最新文章
- 【Qt】通过QtCreator源码学习Qt(四):插件管理PluginManager
- 《编程之美》读书笔记19: 3.9 重建二叉树
- 取消大小周的第一个周末,我吃了顿烤串
- Solaris10下NDOUtils的安装
- 直接操作游戏对象C#游戏开发
- 【DWR系列04】- DWR配置详解
- JavaScript中执行环境和栈
- 程序员:你为什么要离职?
- 重构Webpack系列之六 ---- 配置文件
- Xshell和secureCRT
- html如何改变图片比例,如何更改图片像素和大小
- 股票移动平均线matlab,移动平均线(MA)
- linux 动态监控进程
- 初中学考英语听说计算机考试,2018中考英语听说计算机考试工作重要通知
- 用于数据科学和机器学习的GitHub存储库和Reddit主题
- 电解电容和钽电容的区别是什么
- 机械硬盘通过USB外接到电脑,显示不出来
- 欧几里德算法、拓展欧几里德、中国剩余定理
- 微信摇一摇抽奖的H5制作思路
- python中元组常识,以及for 与 range 的用法!
热门文章
- linux新建虚拟机到图形化界面
- 跨境电商系统的一个架构演进
- Mysql 日期函数 增加周天年月时分秒
- Java 垃圾收集策略、垃圾分代回收算法、垃圾回收运作流程
- Matter-JS Render.create 渲染器创建
- 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_09-修改页面-服务端-接口开发...
- Ubuntu 12.04 部署 PostGIS 2.1
- 阶段1 语言基础+高级_1-3-Java语言高级_09-基础加强_第1节 基础加强_4_Junit_@Before@After...
- mysql 命令之工作小结
- 20169217 2016-2017-2 《网络攻防实践》第四周学习总结