[转载]category与protocol(Object-C 的非正式协议和正式协议)

本文是用于学习笔记,原文来自于 http://blog.csdn.net/dong_007_007/article/details/7490419

着两个都是mac下的协议,用法有点像C++的函数重载和虚函数。

1、Category:

  Category被称为"非正式协议(informal)",可以给原有的类增加新的方法,而不需要重新建一个类,然后在原有的类的基础上使用这个方法,但是不能给类增加新的数据成员。

  eg: 给NSArray增加DeepCopy的方法

  声明:

@interface NSArray(DeepCopy)

-(NSArray* ) deepCopy;

@end

实现:

@implementation NSArray(DeeepCopy)

-(NSArray* ) deepCopy
{
    //.....
}

@end

这样,我们可以在这个给NSArray增加协议的类中使用NSArray的新方法 deepCopy

  NSArray* array = [[NSArray alloc] deepCopy];

可以给一个类中添加多个Category:

@interface NSArray(deepCopy_1)
...
@end


@interface NSArray(deepCopy_2)
...
@end

......

每一个Category都有一个自己新增的方法,但是需要你自己去实现该方法的功能。

Category的使用原则:

1)不能增加数据成员

2)若Category添加的方法与原有的类的方法相同,则原有的方法将被覆盖。


2、protocol:

protocol被称为"正式协议(formal)",与Category不同的是,如果使用了一个protocol,就要实现该协议的所有方法(protocol的方法默认情况下都是申明为@required--必须实现,也可以申明为@optional--自定义的,可实现可不实现)。

protocol协议相当于C++中父类定义的纯虚函数,子类必须实现这些纯虚函数。但是protocol机制不需要继承,只需要声明某个协议,再实现它。

@protocol MouseHandleProtocol

-(void)mouseDown:(int)id;   //未申明类型,则默认为@required类型
@optional

-(void)mouseDrag:(int)id;  //申明为optional类型的,则可以选择实现,也可以不实现
    ......
@end

而后在你的类中使用这个protocol

@interface pen:NSObject<MouseHandleProtocol>   //申明使用MouseHandleProtocol协议
{
     ......
}
 .....
- (void)mouseDown:(int)id;   //必须实现
 - (void)mouseDrag:(int)id;   

@end
@implementation pen
- (void)mouseDown:(int)id
{
    ......
}
......
@end

 protocol使用原则:

1).协议声明了可以被任何类实现的方法
2).协议不是类,它是定义了一个其他对象可以实现的接口
3).如果在某个类中实现了协议中的某个方法,也就是这个类实现了那个协议。
4).协议经常用来实现委托对象。一个委托对象是一种用来协同或者代表其他对象的特殊对象。
5).委托,就是调用自己定义方法,别的类来实现。
6).新特性说明
  @optional预编译指令:表示可以选择实现的方法
  @required预编译指令:表示必须强制实现的方法

posted on 2012-05-24 11:30  笨鸟没先飞  阅读(860)  评论(0编辑  收藏  举报

导航