第9章 多态动态类型和动态绑定(Objective-C 程序设计)

Posted 此女子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第9章 多态动态类型和动态绑定(Objective-C 程序设计)相关的知识,希望对你有一定的参考价值。

9.1 多态:相同的名称,不同的类

使不同的类共享相同方法名称的能力称为多态。它让你可以开发一组类,这组类中的每一个类都能响应相同的方法名。每个类定义都封装了特定方法所需的代码,这就使得它独立于其他的类定义。

9.2 动态绑定和id类型

id数据类型可以存储属于任何类的对象。

 1 id dataValue;
 2         
 3 Fraction *f1 = [[Fraction alloc] init];
 4 Complex *c0 = [[Complex alloc] init];
 5 
 6 dataValue = f1;
 7 [dataValue print];
 8         
 9 dataValue = c0;
10 [dataValue print];

变量dataValue被声明为id对象类型,因此,dataValue可用来保存程序中任何类型的对象。务必注意,声明中并没有使用星号。

9.3 编译时和运行时检查

因为存储在id变量中的对象类型在编译时无法确定,所以一些测试推迟到运行时进行。

1 id dataValue = [[Fraction alloc] init];
2 [f1 setReal: 10.0 andImaginary 2.5];

这些代码在进行编译时并不会产生警告,因为编译器在处理源文件的时候并不知道存储在dataValue中的对象类型(即编译器并不知道Fraction对象已经存在于这个变量中)。

而当程序运行时,系统首先检查存储在dataValue中的对象类型,因为在dataValue中存储有Fraction,所以运行时系统检查并查找定义在Fraction类中的setReal:andImaginary:方法。因为未找到这个方法,所以显示前面的出错消息并且终止程序运行。

9.4  id数据类型与静态类型

将一个变量定义为特定类的对象时,使用的是静态类型。“静态”指的是对存储在变量中的对象的类型进行显示声明。这样,存储在这种形态中的对象的类是预定义的,也就是静态的。使用静态类型时,编译器尽可能确保变量的用法在程序中始终保持一致。编译器能够通过检查来确定应用于对象的方法是由该类定义的还是由该类继承的,否则它将显示警告。

不能为id变量使用点运算符,编译器会报错。

以上是关于第9章 多态动态类型和动态绑定(Objective-C 程序设计)的主要内容,如果未能解决你的问题,请参考以下文章

第9章 多态和抽象

第10章 多态

java编程思想第八章多态

iOS开发笔记系列-基础3(多态动态类型和动态绑定)

9-3:C++多态之多态的实现原理之虚函数表,虚函数表指针静态绑定和动态绑定

Java多态之动态绑定