黑马程序员技术交流社区
标题: 学习笔记12-OC类的特性( 二) [打印本页]
作者: 仰望星空的猪 时间: 2015-11-23 19:31
标题: 学习笔记12-OC类的特性( 二)
本帖最后由 仰望星空的猪 于 2015-11-27 10:44 编辑
1 多态
多态:某一类事物的多种形态。
程序中多态:不同的对象以自己的方式响应相同的方法的能力。每个对象都可以有自己的同名方法。
多态的条件
有继承关系,有同名方法的重写。
基类 * 对象名=[子类 new];//父类的指针指向子类的对象。
多态的优点
简化编程借口。容许类和类之间的同名方法。
多态的实现
1) 基类定义方法并实现(-run())
2) 派生类重写父类的同名方法(-run())
3) 父类指针指向子类对象
基类 * 对象名=[子类 new];
4) 父类指针调用子类方法
[对象名 方法];
多态的原理
动态类型可以使直到程序运行时才确定对象所属的类型。
动态类型绑定能使程序执行时才确定对象调用的实际方法。
注意
存在多态时,父类可以访问子类特有方法。需要强制类型转换。将父类指针类型转换为子类指针类型。
2 类的本质
类的本质还是类(类对象)。是另外一个类的对象。
类对象是一种数据结构,存储的是类的基本信息:类大小,类名,类版本以及消息与函数的映射表。
类对象代表类。
class代表类对象,类方法属于类对象。
Person *p =[Person]
p 是Person实例对象
Person 是class类的类对象
类对象获取
1) 通过实例对象获取
Class c=[p class]; Person
2) 通过类名对象
Class c =[ Person class];
类对象的使用
可以创建对象 Person *p= [c new]; c可以当Person用
可以调用类方法
3类对象的存储
类对象(Person)也在堆区存储。_isa指向代码区。
实例对象(p)_isa 指向类对象的地址。
P指向类对象。
SEL
对方法的包装,表示方法的存储位置。
1) 当实例对象调用方法的时候会把这个方法包装成SEL类型的数据
2) 根据SEL找到对应的方法地址。
3) 根据方法地址调用方法。
使用
Person *p=[Person new]; // Person类中有方法 –eat()
SEL sel =@selectot(eat);
[ p performSelector :sel ]; //响应方法
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |