B.8.2 分类定义
一般格式:
@interface className(categoryName)<protocol,……>
methodDeclaration
methodDeclaration
……
@end
这个格式通过className和列出的相关方法为该类指定了一个分类categoryName。如果列出了一个或多个协议,则分类将采用这个(些)列出的协议。
编译器必须通过前面为该类声明的@interface部分中知道className。
只要你愿意,可以在任意多个的不同源文件中定义任意多个分类。列出的方法将成为类的一部分,并将被子类继承。
分类由className和categoryName这对名称惟一定义的。例如,在指定的程序中可能只有一个NSArray(Private)分类。然而,有个别分类的名称可以被重用。因此,指定的程序可以包含一个NSArray(Private)分类和一个NSString(Private)分类,而且这两个分类将明显地相互区分开。
对于定义在分类中的那些你并不想使用的方法,无需实现它们。
分类可以只展开一个有附加方法的类定义,或重载类中现有的方法。但它不能为该类定义任何实例变量。
如果一个或多个分类将同一个类中的某个方法声明成同一个名称,那么没有定义调用时将执行哪个方法。
作为一个例子,
import“Complex.h”
@interface Complex(ComplexOps)
-(Complex*)abs;
-(Complex*)exp;
-(Complex*)log;
-(Complex*)sqrt;
@end
定义了Complex类的一个名为ComplexOps的分类,它有4个实例方法。大概,程序的某处会出现一个对应的实现部分,以实现这些方法中的一个或多个。
import“ComplexOps.h”
@implementation Complex(ComplexOps)
-(Complex*)abs
{
……
}
-(Complex*)exp
{
……
}
-(Complex*)log
{
……
}
-(Complex*)sqrt
{
……
}
@end
如果一个分类定义的方法打算由其他子类实现,那么这个分类称为非正式协议或抽象分类。与正式协议不同,编译器并不对非正式协议的一致性进行任何检查。在运行时,可能以一个专用方法为基础来测试对象与非正式协议的一致性,但也可能不测试。例如,一个方法可能在运行时被请求,而同一个协议中的另一个方法则可能不被请求。