我所认为的Protocol(协议)是类似于java中的接口这一概念的,所谓协议,可以理解成一个类所具有的方法的特征集合,协议也属于面向对象的一部分,使用它,可以弥补类的不能多继承缺点,继承和协议的双重设计既保持了类的数据安全也变相实现了多继承
这里的Protocol(协议,也算是java的接口),我始终认为其大致可以分为两种情况: 1.调用协议 2.回调协议(委托)
调用协议
我们在学习语言的课本中,比如在学习Protocol,课本上会给出这样的例子:
我们知道鸟都会飞,那么我们假定会飞的都是鸟,所以,我们可以定义一个包含fly方法的Protocol,名字叫BirdProtocol,这样,只要实现了BirdProtocol这个协议的类,都是属于鸟类的,然后我们就可以调用实现了这个协议的鸟类
比如说我们新建了一个啄木鸟类,它肯定有一个eatWorn(吃虫)这个方法,然后再让其实现BirdProtocol协议还有里面的方法,则啄木鸟类就是一个名正言顺的"鸟"类了
然后在定义一个鹦鹉,它有一个speak方法,在实现BirdProtocol协议还有里面的方法,则其也是一个"鸟"类
说了这么多,可能有人要问,好像这个Protocol并没有什么作用吧,我新建一个啄木鸟类,实现eatWorn与fly方法,新建一个鹦鹉类,实现speak与fly方法,不一样吗?
其实并不是这样,协议这个概念之所以非常重要,肯定是有他的道理,就拿上述例子来说,新建两个类并实现相同的Protocol后,好处就是:
1.可以规范类的行为,比如新建啄木鸟这个类得时候,将鸟飞的方法写成flyInTheSky,鹦鹉写成fly方法,这会给后期维护带来很大的压力,
2.(最重要得)可以用来向上转型 比如说我们可以创建一个鸟类的引用A,然后实例化一个啄木鸟的对象,让A指向啄木鸟,创建一个鸟类的引用B,然后实例化一个鹦鹉的对象,让B指向鹦鹉,这样做得好处是能让实现相同接口的类得到统一化的管理与使用
下面上代码:
首先是鸟类这个协议 (需要注意的是,可以看见,fly方法前面有一个@required标志,标记着这个实现此协议的类必须实现此方法,如果想要可以不实现此方法的话,可以在方法前面加上@optional标记。协议中方法默认标记是@required。如果一个类实现了一个协议,但未实现全部此协议的带有@required的方法,系统会弹出警告)
#import/** 鸟类的协议 */ @protocol BridProtocol @required -(void) fly; @end
下面是啄木鸟类 .n文件:
#import
#import "BridProtocol.h"
/**
啄木鸟类
实现了鸟类这个协议
*/
@interface WoodPecker : NSObject
@end
#import "WoodPecker.h"
@implementation WoodPecker
-(void) eatWorn{
NSLog(@"我是啄木鸟,我在吃虫");
}
-(void) fly{
NSLog(@"我是啄木鸟,在天上飞");
}
@end
#import
#import "BridProtocol.h"
/**
鹦鹉类
实现了鸟类的协议
*/
@interface Parrot : NSObject
@end
#import "Parrot.h"
@implementation Parrot
-(void) speak{
NSLog(@"我是鹦鹉,我在说话");
}
-(void) fly{
NSLog(@"我是鹦鹉,我在飞");
}
@end
#import
#import "WoodPecker.h"
#import "Parrot.h"
#import "BridProtocol.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
WoodPecker *pecker = [[WoodPecker alloc] init];
//创建一个鸟类的引用,指向啄木鸟对象
id birdA = pecker;
[birdA fly];
Parrot *parrot = [[Parrot alloc]init];
//创建一个鸟类的引用,指向鹦鹉对象
id bridB = parrot;
[bridB fly];
}
return 0;
}
执行结果:
我是啄木鸟,在天上飞
我是鹦鹉,我在飞
哈哈,书上大致讲的就是这样,这样使用协议可以弥补类的不能多继承缺点,但我们在实际项目中,使用这样的机会不是很多,而是用协议最广泛的方面,及时回调协议,也就是我们所说的委托
第一节就先说到这,下一节说的是最重要的Delegate
链接为 IOS Protocol与Delegate详解(二)