分类:
分类提供了一种简单的方式,用它可以将类的定义模块化到相关方法的组或分类中。它还提供了扩展现有类定义的简便方式,并且不必访问类的源代码,也不需要创建子类。
#import "Fraction.h"
@interface Fraction (MathOps)
-(Fraction *) add: (Fraction *) f;
-(Fraction *) mul: (Fraction *) f;
-(Fraction *) sub: (Fraction *) f;
-(Fraction *) div: (Fraction *) f;
@end
注意,这既是接口部分的定义,也是现有接口部分的扩展。因此,必须包括原接口部分,这样编译器就知道Fraction类。
按照惯例,作为分类的.h和.m文件的基本名称是由类的名称紧接着分类的名称。例如:FractionMathOps.m
一些程序员使用符号“+”来分隔类和分类的名称,比如Fraction+MathOps.h。呵呵,这个倒是有点像C语言的下划线分割一样。一般情况下就不要这么搞了。
类的扩展:
创建一个未命名的分类,且在括号“()”之间不指定名字,这是一种特殊的情况。这种特殊的语法定义为类的扩展。未命名类中声明的方法需要在主实现区域实现,而不是在分离的实现区域中实现。
未命名分类是非常有用的,因为它们的方法都是私有的。如果需要写一个类,而且数据和方法仅供这个类本身使用,未命名类比较合适。
关于分类的注意事项:
分类可以覆写该类中的另一个方法,但是通常认为这种做法是做虐的设计习惯。所以需要注意:
第一、覆写了一个方法后,再也不能访问原来的方法。(如果确实需要覆写方法,正确的选择可能是创建子类。)
第二、通过使用分类添加新的方法来扩展类不仅仅影响这个类,同时也会影响它的所有子类。
第三、对象/分类命名对必须是唯一的。因为大家使用的名称空间是程序代码、库、框架和插件共享的。
|
|