多态、动态类型和动态绑定
(参考书Objective-C 2.0 程序设计)
一、概念:
多态使得能够开发以下程序:来自不同类的对象可以定义共享相同的名称的方法;动态类型能使程序直到执行时才能确定对象所属的类;动态绑定则能使程序直到执行时才能确定要对对象调用的方法
二、动态:相同的名称,不同的类
1、程序的执行:Objective-C运行时知道语句中消息的接收者是某类的对象,然后选择定义在该类中的方法来执行。
如:compResult=[c1 add : c2];
[compResult print]; 详细代码请见 P/155
Fraction和complex类都包含add: 和print 方法。
所以:当Objective-C运行时知道第一条消息的接收者是c1是一个complex对象。
因此:选择定义在complex类中的add; 方法。
2、其它作用:多态还允许你后来添加新类,这些类能响应相同的方法名。
三、动态绑定和id类型
1、Id类型:一种通用类型,可以用来存储属于任何类型的对象。
2、Id类型的作用:可以将任何类型的对象存储到id类型中,并可以对id类型调用于原对象的任何方法。
3、方法调用过程:Objective-C系统总是跟踪对象所属的类。先判定对象所属的类,并因此确定运行时而不是编译时需要动态调用的方法。
如:datavalue=f1;
[datavalue print]; 详细代码请见P/156
在程序执行期间,当系统准备将print消息发送给datavalue时,它首先检查datavalue中存储的对象所属的类。这个变量保存一个Fraction因此使用在Fraction类中定义的print方法。
四、编译时和运行时检查
概念:因为存储在id变量中的对象类型在编译时无法确定,所以一些测试推迟到运行时进行。就是说,推迟到程序执行时。
五、Id类型与静态类型
1、静态类型:“静态”这个词指的是这个变量总是用于存储特定类的对象。存储在这种形态中的对象的类是预定的。编译器能够通过检查来确定应用于对象的方法是哪个类定义的或者由哪个类继承,否则它将显示警告。
注:关心静态形态是因为它能更好的在程序编译阶段而不是在运行时指出错误。如果把它留到运行时,可能在程序运行时,没有发现错误。且可以增强程序的可读性。
2、动态类型的参数和返回类型:
如果在多个类中实现名称相同的方法,那么每个方法都必须符合各个参数的类型和返回值类型。
六、使用@try处理异常
1、程序测试时可能会发生诸多异常导致程序异常终止。可以用@try来处理异常:
2、使用格式: @try
{
statement
statement
……
}
@catch(NSException *exception)
{
Statement
Statement
……
}
释义:在@try块中加入这些statement后,程序正常运行。但是,如果块中的某一条语句抛出异常,执行不会终止,而是立即跳到@catch块,在那里继续执行。在@catch块内可以处理异常。
示例代码请见 P/165
3、@throw指令:@throw指令允许你抛出自己的异常。可以使用指令抛出特定的异常,或在@catch块内抛出异常。