分类和协议
一、分类
1、分类:分类提供了一种简单的方式,用它可以将类的定义模块化到相关方法组或分类中。它还提供了扩展了现有类定义的简便方式,并且不必访问类的源代码。
2、使用方法,如:为Fraction类添加新分类
#import “Fraction.h”
@interface Fraction(Mathops)
-(Fraction *) add:(Fraction *)f;
-(Fraction *) mul:(Fraction *)f;
-(Fraction *) sub:(Fraction *)f;
-(Fraction *) div:(Fraction *)f;
@end
注:这既是接口部分的定义,也是现有接口部分的扩展。因此,必须包括原始接口部分,这样编译器就知道Fraction类(除非直接将新分类结合到原始Fraction的头文件。
3、关于分类的一些注意事项
1>、尽管分类可以访问原始类的实例变量,但是它不能添加自身的任何变量。
2>、分类可以重载类中的另一个方法,但是,通常认为这种做法是拙劣的设计习惯。
3>、可以拥有许多分类,只要遵守此处指出的规则。
4>、和一般接口部分不同的是,不必实现分类中所有方法。
5>、通过分类添加的新方法来扩展类不仅会影响这个类,同时也会影响它的所有子类。
6>、通过分类为现有类添加新的方法可能对你有用,但它们可能和该类的原始设计或意图不一致。
7>、对象/分类命名对必须是唯一的。但是,在给定的Objective-C名称空间中,只能存在一个NSString(私有的)分类。
二、协议
1、协议:是多个类共享的一个方法列表,协议中列出的方法没有相应的实现;由其它人来实现。协议提供一种方式来使用指定的名称定义一组多少有点相关的方法。
2、定义方式:只要使用@protocol指令,之后是协议名称。
如:在标准的Foundation头文件NSObject.h中定义NSCopying协议。
@protocol NSCopying
-(id)copyWithZone:(NSZone *)zone;
@end;
3、采用协议:如果你的类采用某协议,则必须实现该协议中的一些方法。
如:采用NSCopying协议,必须实现名为copyWithZone方法
@interface AddressBook:NSObject(NSCopying>.
注:如果要采用多项协议,只要把它们放于尖括号中,用逗号来隔开。
4、检查一个对象是否遵循某项协议
如:一个名为currentObject对象,查看它是否遵循Drawing协议。
Id currentObject;
……
If([currentObject conformsToProtool:@protocol:(Drawing)]==YES)
{
//send currentObject paint,erase and/or out line msgs
……
}
这里使用专用的@protocol指令用于获取一个协议名称,并产生一个protocol对象,conformsToProtool:方法期望这个对象作为它的参数。
5、非正式协议(informal)
1>概念:它实际上是一个分类,列出了一组方法但并没有 实现它们。
2>添加方式:使用@optional即可。
3>、采用非正式协议:不需要采用此协议的所有方法,具体取决于这项协议。
6、注意
1>协议不引用任何类,它是无类的。
2>、和类名一样,协议名必须是唯一的。
三、合成对象
1、概念:定义一个包含其他类的一个或多个对象的技术。
2、合成方式,如:定义一个带有Rectangle类的Square类
@interface Square:NSObject
{
Rectangle *rect;
}
-(int) setSide:(int) s;
-(int) side;
-(int) area;
-(int) perimeter
@end
3、一个解决方案是重载init或添加initWithSide之类的新方法来分配空间。