ios开发-OC-封装、继承、多态

一、封装的概念及原理

1、为什么要进行封装?
不封装的缺点:
当一个类把自己的属性暴露给外部的时候,那么该类就失去对属性的管理权
将数据隐藏起来,只能用此类的方法函数才可以访问或者设置数据,不可被外部任意存储是面向对象设计本质。降低了数据被无用的可能性!
在OC语言中,使用@interface和@implementation来处理类。
@interface就好像暴露在外面的时钟表面,像外界提供展示以及接口。@implementation就好像隐藏在时钟内部的构造实现,把具体的实现封装了起来。

2、封装的原理?
实例变量默认只能被当前类的对象方法访问。

二、封装的实现步骤
1、封装的步骤
定义设置实例变量(setter)方法和访问实例变量(getter)的方法
1)setter方法(设置器)
在开发过程中,考虑到安全性要求,我们一般不在成员变量名前面使用@public、@protected等关键字修饰,而是使用Set方法来为对象提供成员变量的值。在set方法的内部也可以对一些不合理的赋值进行筛选过滤。
Set方法的作用:为外界提供一个设置成员变量值的方法
命名规范:
(1)方法名必须以set开头
(2)Set后面跟上成员变量的名称,首字母大写
(3)返回值一定是void
(4)一定要接收一个参数,而且参数类型需要和成员变量的类型一致
(5)形参名不能和成员变量名一样(苹果官方推荐成员变量名前加_以示区分)

Set方法的好处:
(1)不让数据暴露在外,保证了数据的安全性
(2)对设置的数据进行过滤
Set方法的声明:

Set方法的实现:

2)getter方法(访问器)
Get方法的作用:为调用者返回对象内部的成员变量
命名规范:
(1)一定有返回值,返回值的类型和成员变量的类型一致
(2)方法名和成员变量名一样
(3)不需要接收任何参数
Get方法的声明:

Get方法的实现:

3)注意
(1)在实际的开发中,不一定set和get方法都会提供,如果内部的成员变量比如学生的学号这样的数据只允许外界读取,但是不允许修改的情况,则通常只提供get方法而不提供set方法。
(2)成员变量名的命名以下划线开头,get方法名不需要带下划线,使用下划线开头有两个好处:(1)与get方法的方法名区分开来;(2)可以和一些其他的局部变量区分开来,下划线开头的变量,通常都是类的成员变量。

二、类的继承和派生概念

1、什么是继承?
2、OC中的继承与派生
交通工具是一个基类(也称做父类),通常情况下所有交通工具所共同具备的特性是速度与额定载人的数量,
但按照生活常规,我们来继续给交通工具来细分类的时候,我们会分别想到有汽车类和飞机类等等,汽车类和飞类同样具备速度和额定载人数量这样的特性,而这些特性是所有交通工具所共有的,那么当建立汽车类和飞机类的时候我们无需再定义基类已经有的数据成员,而只需要描述汽车类和飞机类所特有的特性即可,飞机类和汽车类的特性是由在交通工具类原有特性基础上增加而来的,那么飞机类和汽车类就是交通工具类的派生类(也称做子类)。以此类推,层层递增,这种子类获得父类特性的概念就是继承。

三、基类和派生类之间的关系

1、基类和派生类之间的关系
注意:
1)基类的私有属性能被继承,不能被使用。
2)OC中的继承是单继承:也就是说一个类只能一个父类,不能继承多个父类3)继承的合理性:
引用《大话西游》里的一句话来描述继承的。“人是人他妈生的,妖是妖他妈生的!”

2、方法的重写
方法的重写,从父类继承的方法,可能这个方法并不适合子类,可以在子类中重写父类的方法。

@interfaceAnimal : NSObject
{
int_tuiNum; //退的个数
int_eyeNum; //眼睛个数
}
-(void)setTuiNum:(int)tuiNum;
-(void)setEyeNum:(int)eyeNum;
-(int)tuiNum;
-(int)eyeNum;
-(void)eat;
-(void)run;
#import "Animal.h"
@interfaceDog : Animal
{
}
-(void)eat;//覆盖父类的eat的方法
@end

重写之后,父类的对象调用父类的方法;子类的对象,调用子类的方法,不会引起冲突。
从父类继承的方法,不适用于子类时,可以直接声明父类的同名方法,并定义。
不用考虑父类中,方法已存在的问题。

3、基类和派生类之间的关系
重写后,子类可以通过super调用父类的方法。

三、继承的注意事项

1、继承的注意事项
1)子类不能定义和父类同名的变量,但是可以继承父类的变量
2)OC类支持单一继承,不支持多继承
3)OC类支持多层继承

2、继承体系中方法调用的顺序
1、在自己类中找
2、如果没有,去父类中找
3、如果父类中没有,就去父类的父类中
4、如果父类的父类也没有,就还往上找,直到找到基类(NSObject)
5、如果NSObject也没有就报错了

四、多态的概念和条件

1、什么是多态?
多态指的是:同一种行为,对于不同的事物具有不同的表现形式。这就叫做多态。
举个例子:
老师给你布置1个任务,让你给老师找了3个人来。
结果你给老师找了1个医生,1个演员,1个理发师。
请问这样可以吗?
当然可以,医生、演员、理发师他们都是人,完全符合老师的要求。

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

2、多态的条件
多态的条件:有继承关系、有方法重写
父类的声明变量指向子类对象。
//代码体现:用父类类型的指针指向了子类对象,这就是多态
狗*g = [狗new];
动物*a = [狗new];
猫*c = [猫new];
动物*a = [猫new];

3、多态的优点
多态的主要好处就是简化了编程接口。它容许在类和类之间重用一些习惯性的命名,而不用为每一个新加的函数命名一个新名字。这样,编程接口就是一些抽象的行为的集合,从而和实现接口的类的区分开来。
多态也使得代码可以分散在不同的对象中而不用试图在一个函数中考虑到所有可能的对象。这样使得您的代码扩展性和复用性更好一些。当一个新的情景出现时,您无须对现有的代码进行改动,而只需要增加一个新的类和新的同名方法。

五、多态的实现

1、如何实现多态?
Animal是父类,子类有Cat 和 Dog,子分别重写了父类中的eat方法;实例化对象的时候可以用下面的方法:
Animal *animal = nil;
//实例化猫的对象
animal = [Cat new];
[animal eat];
//实例化狗的对象
animal = [Dog new];
[animal eat];

2、多态的原理
动态绑定:
动态类型能使程序直到执行时才确定对象所属类型
动态类型绑定能使程序直到执行时才确定要对对象调用的实际方法
OC不同于传统程序设计语言,它可以再运行时加入新的数据类型和新的程序模块:动态类型识别,动态绑定,动态加载
id类型:通用指针类型,弱类型,编译时不进行类型检查

3、多态的注意点
1)如果存在多态,父类是可以访问子类特有的方法
假设子类Dog 有一个特有的方法bark
[dog bark];
Animal *an2 = [Dog new];
[(Dog*)an2 bark]; //把父类的指针,强制类型转换

2)如果不存在多态,父类是不可以访问子类特有的方法的
Animal *an3 = [Animal new];
[(Dog*)an3 bark];//错误的,不能强制转换

六、类对象的存储细节

1、类对象的存储

SEL类型

1、SEL类型
SEL:全称selector 一种用来表示方法名类型的数据类型(方法名)。
SEL类型作用:
1)可以定义变量
2)可以用来作为方法的形参
3)可以用来作为方法的实参
类中方法存储的原理:
1)类里面的方法都是被转换成SEL变量进行存储的。
2)当类声明一个对象,对象调用方法的时候,系统会把这个方法转换成SEL,然后拿这个SEL到类方法中去匹配。

Person*p=[[Personalloc]init];
[ptest];
寻找方法的过程:
(1)首先把test这个方法名包装成sel类型的数据;
(2)根据SEL数据找到对应的方法地址;
(3)根据方法地址调用相应的方法。
(4)注意:在这个操作过程中有缓存,第一次找的时候是一个一个的找,非常耗性能,之后再用到的时候就直接使用。

关于_cmd:每个方法的内部都有一个-cmd,代表着当前方法。
注意:SEL其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去寻找对应的方法地址,找到方法地址后就可以调用方法。这些都是运行时特性,发消息就是发送SEL,然后根据SEL找到地址,调用方法。

3)我们可以自己手动把方法转换成SEL,然后用这个SEL去查找方法。

学习心得:
通过本章知识点的接触,掌握了类的几个特性,封装,继承,多态,以及在oc中的应用,多态的核心是用父类的指针指向之类的对象,封装将数据隐藏起来,降低了数据无用的可能性,多态,用父类类型的指针指向了子类对象,简化了编程接口。三大特性使得oc使用和编程更加方便。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值