分类和协议

来源:互联网 发布:知茵女装网上有卖吗 编辑:程序博客网 时间:2024/05/16 15:37

分类和协议

一、分类

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之类的新方法来分配空间。

原创粉丝点击