类簇(cluster):
由于OC并没有提供抽象类的语法支持,而在实际项目的开发中,总有需要抽象类的时候,此时就会选择定义给一个父类,并以该父类派生多个子类,其他程序使用这些类时,总是面向父类编程,当程序调用父类的初始化方法,静态方法来返回对象时,实际上返回的是子类的实例。这系类的类被称为一个类簇,这个父类也就模拟了抽象类的功能。
类别只能定义方法,是方法的模块化管理。
1.通过类别为指定类添加新方法之后,这个新方法会影响到这个类的所有子类,每个子类都会获得类别扩展的方法
2.可根据需要为一个类定义多个类别,不同的类别都可对原有的类增加方法定义
定义类别的语法与定义类的语法存在如下差异:
定义类是使用的类名必须是该项目中没有的类,而定义类别时使用的类名必须是是已有的类。
定义类别时必须使用圆括号来包含类别名
类别中通常指定义方法
用法:
1.对类进行模块化设计
将一个庞大的类分成几个小类文件
2.调用私有方法
若一个方法只在实现部分定义,可在main()中加入声明。
@interface 类名 (扩展)
//声明的方法
@end
:@interface FKItem (fk)
-(double) calDiscount:(double)discount;
@end
3.实现非正式协议
6.3.4 扩展(extension)
相当于匿名类别
@interface 已有类()
{
实例变量
}
//方法定义
...
@end
定义类的扩展时,可以额外增加实例变量,也可以使用@property @synthesize 来合成setter.getter方法,但定义类的列表时,则不允许额外定义实例变量。
扩展是当类实现的时候,不仅要实现本身定义的部分,还要实现扩展的部分才能够运行。类似与接口的作用。】在目标类的实现部分需要导入扩展的.h文件
非虽然OC编译器并不强制遵守非正式协议的类必须实现该现该协议中所有的方法,但如果该类没有实现非正式协议中的某个方法,那么程序运行时如果调用该方法,就会引发unrecognized selector的错误。