多态:相同的名称,不同的类
动态绑定和id类型
id数据类型,是一种通用的对象类型。也就是说,id可以用来存储属于任何类的对象。
id dataValue;
Fraction *f1 = [Faction new];
Complex *c1 = [Complex new];
[f1 setTo: 2 over: 5];
dataValue = f1;
[dataValue print];
[c1 setReal: 10.0 andImaginary: 2.5];
dataValue = c1;
[dataValue print];
Objective-C系统总是跟踪对象所属的类,先判断对象所属的类,然后在运行时确定需要动态调用的方法,而不是编译的时候。
编译时和运行时检查
id数据类型和静态类型
讲一个变量定义为特定类的对象时,使用的是静态类型。
编译检错
动态类型的参数和返回类型
有关类的问题
从名为square的类中获得类对象:
[Square class]
如果mySquare是Square对象的实例,可以通过如下嗲吗知道它所属的类:
[mySquare class]
要查看存储在变量obj1和obj2中的对象是不是相同的类实例,可以编写:
if ([obj1 class] == [obj2 class])
要查看变量myFraction是不是Fraction类的实例,可以编写:
[myFraction isMemberOfClass: [Fraction class]]
要查看Fraction类的实例是否响应setTo:over方法,可以编写:
[Fraction instancesRespondToSelector: @selector (setTo:over:)]
使用@try处理异常
Fraction *f = [Fraction new];
@try {
[f noSuchMethod];
}
@catch(NSException *exception) {
NSLog(@"Caught %@%@",[exception name],[exception reason]);
}