IOS第八天——Obj-C的多态性、动态类型和动态绑定
来源:互联网 发布:星星知多少迷你世界 编辑:程序博客网 时间:2024/05/19 04:55
开始今天的学习课程之前先说几句废话,昨天爬山去了,算是户外运动的入门级别,路线是:香山邮局-好汉坡-打赢哇-猴子爬-水库-八大处,大概行程是12.5KM,历时大概6个小时,不过同行的姑娘们表现也很棒,赞一个先,像我们程序员这种每天坐在办公室七八个小时的,尽量的可以多做一些户外运动,对身体是挺有好处的。
OK,废话完成,开始今天的学习。Obj-C是一门强大的面向对象的编程,因此它具有面向对象的很多特征,比如多态性,支持动态类型和动态绑定。我们来分别学习一下:
1. 多态性
多态性是个生物名词,用来表示生物体在生命周期中的不同形态,用在编程语言中则表示相同的方法名,但是却有不同的实现方式。或者说相同的名字,不同的类。我们来看一个书上的示例:
- #import <Foundation/Foundation.h>
- //定义类 A
- @interface A : NSObject
- -(void)print
- @end
- @implementation
- -(void)print
- {
- NSLog(@"this is Class A");
- }
- @end
- //定义类 B
- @interface B : NSObject
- -(void)print
- @end
- @implementation
- -(void)print
- {
- NSLog(@"this is Class B");
- }
- @end
- int main(int argc, char *argv[])
- {
- NSAutoreleasePool * pool=[[NSAutoreleasePool alloc] init];
- A *a=[[A alloc] init];//实例化类A对象
- B *b=[[B alloc] init];//实例化类B对象
- [a print]; //调用类A的print方法
- [b print]; //调用类B的print方法
- [a release]; //释放实例a
- [b release]; //释放实例b
- [pool drain];
- return 0;
- }
程序的最终输出结果如下:
this is Class A
this is Class B
那么类A和类B都包含了print方法,那么系统怎么知道什么时候调用哪个方法呢?因为Obj-C运行环境时支持类型检查,知道类A是print消息的第一个接收者,类B是第二个接收者,那么也就是同一个方法名有不同的类实现,我们称之为多态性。
2. 动态绑定和动态类型
id是公用的对象类型,它可以用来存放任何类的对象,那么我们就再来看一个如何运用id实现动态绑定的例子:
- int main(int argc, char *argv[])
- {
- NSAutoreleasePool * pool=[[NSAutoreleasePool alloc] init];
- id temObj; //声明一个id类型
- A *a=[[A alloc] init];//实例化类A对象
- B *b=[[B alloc] init];//实例化类B对象
- temObj=a; //将a对象赋值给temObj
- [temObj print]; //调用类A的print方法
- temObj=b; //将b对象赋值给temObj
- [temObj print]; //调用类B的print方法
- [a release]; //释放对象a
- [b release]; //释放对象b
- [pool drain];
- return 0;
- }
在上面的代码中我们可以看到temObj被声明为id类型,因此它可以存放任何类型的对象,当temObj存放类A的对象a时,我们就可以通过temObj调用类A的全部方法,同样,当temObj存放的类B的对象b时,我们也可以通过temObj来访问类B的全部方法。
那么,程序是如何知道我们要调用哪一个类的print方法呢?很简单,因为Obj-C在运行时,环境会一直对“对象属于哪个类”进行追踪,基于动态类型和动态绑定的概念,系统会对对象的类作出正确的决定,系统会在运行的时候而不是编译的时候决定调用哪一个方法。
下面是Object类确认对象类型的基础API:
上面的表格中提到了常用的api方法,那么在程序中我们可以灵活使用这些api来方便地实现各种动态编程语言特性,使得Obj-C拥有了很多动态脚本语言才有地特性
2013年04月21日,Eric.Tang 记
- IOS第八天——Obj-C的多态性、动态类型和动态绑定
- IOS第八天——Obj-C的多态性、动态类型和动态绑定
- IOS第八天——Obj-C的多态性、动态类型和动态绑定
- Obj-C的多态性、动态类型和动态绑定
- Obj-C的多态性、动态类型和动态绑定
- IOS开发中的多态性、动态类型和动态绑定
- iOS多态性 动态绑定 与动态类型
- Objective-C之成魔之路【11-多态性、动态类型和动态绑定】
- 三十三、多态性、动态类型 和 动态绑定(六)关于物件类型的问题
- 二十九、多态性、动态类型 和 动态绑定(二)动态绑定 和 id类型
- object-c 继承、多态动态绑定 第八天
- 黑马程序员——Objective-C程序设计(第4版)学习笔记之09-多态、动态类型和动态绑定——黑马 IOS 技术博客
- Objective-C 编程全解-第04章 对象的类型和动态绑定
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第九章 多态,动态类型和动态绑定
- 二十八、多态性、动态类型 和 动态绑定(一)多态性:不同的措施 共用 同一个名称
- iOS 动态类型和动态绑定
- iOS动态类型和动态绑定
- 三十二、多态性、动态类型 和 动态绑定(五)措施所附带的参数 和 所产生的结果类型
- 这里实现定界加锁线程安全的单例模式
- 工厂方法模式
- Django学习笔记(一)项目的创建
- android ImageView scaleType属性
- 程序员也是一种方向
- IOS第八天——Obj-C的多态性、动态类型和动态绑定
- POJ2584_T-Shirt Gumbo(二分图多重最大匹配/最大流)
- “局部内部类只能访问被final修饰的局部变量”的解释
- 第七天-面向对象(继承,抽象类,接口)
- 一个只能在堆产生对象的类实现
- spring定时任务
- 关于数组类型的json解析方法
- JavaScript入门:004—JS注释的写法和基本运算符
- SuperSale - UVa 10130 01背包