拓展类
在Objective-C中有件事就是没有直接类比C++中类别的思想—被添加到现存的类中方法的集合。一旦类别被装载,他们就和其他方法没有区别。类别象类,和接口和实现一起声明。
类别接口可以被使用而不用回应公开给其他方法的实现,象给出的C++中的友元类。如果你在类中实现方法,但没有在接口中声明他们,你会得到一个编译时警告。你可以象这样定义类别接口:
@interface AnObject (Private)
- (void) privateMethod;
@end
- (void) privateMethod;
@end
如果你把它放在实现文件的顶部,当你发送一个-privateMathod消息给一个AnObject实例就不会得到运行时警告。名字是无括弧的就是类别的名字。这可以是任何。注意,没有@implementation部分,这就像C语言头部分的函数说明。如果在C中没有函数实现的回应,会得到链接错误。如果在Objective-C中没有相应方法实现回应,会得到一个运行时异常。
通过使用类别你可以提供额外的方法实现,以同种方式当你提供“正式”方法时:
@implementation AnObject (NewMethods)
- (void) newMethod
{
...
}
@end
- (void) newMethod
{
...
}
@end
如果你发送一个-newMethod消息给AnObject的任何一个实例,这个方法都会被调用。你可以使用这个来取代以你自己的版本对象中现存的方法,所以,对询问中的对象你不必存储到源代码。这种方式常常用于类库中各种方法,但也可以用于在没有源代码的情况下修补第三方类库的bug。
缺少归档类别的一部分就是类库允许你对现存对象的协议增加一致性。如果你的类别采用了协议,还没有对每个方法提供实现,你会得到编译时警告,并且会进行运行时测试来检查一致性。在étoilé中我们使用这种便利对集合协议增加一致性,假设Foundation中所有集合类都有一个持久接口。