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变量使用点运算符,编译器会报错。
原文地址:https://www.cnblogs.com/cinvzi/p/8410885.html
时间: 2024-10-11 13:25:35