Protocol协议:
1:协议其实很简单,协议就是规定,谁遵循了我的协议,谁就能够指向我,比如说,小明实现了好人协议,那么小明就是一个好人
2:协议本身只是提供方法的声明,并不实现方法,谁遵循了协议,谁就要实现协议中定义的方法(跟java中的抽象方法有点类似,都是一些共有的属性),说白了协议里面就是一堆方法的声明,等着类引用去实现
3:一个类可以同时遵循多个协议
4:协议本身也可以遵循其他协议(可以多个),NSObject是一个基础协议
5:父类遵循了那些协议,子类同样遵循那些协议
6:协议也可以再.m文件中临时加,但是只能自己用,当然也要实现当中的方法,这种情况一般都是不需要许多的类去遵循的协议,也就是一个类所特有的协议
7:协议跟分类有点相似,协议当中也不能够声明成员变量,实际开发当中,也是先写协议后写类的
一:创建一个Protocol
创建一个protocol协议跟category差不多, 也是在 Objective-C File 里面
二:实例应用
我们创建三个协议:流氓协议,Person协议,学生协议
流氓协议:
#import <Foundation/Foundation.h>
#import "StudentProtocol.h"
//谁遵循了协议,谁就要实现协议中定义的方法,协议本身只提供方法的声明,并不实现方法
//协议本身也可以遵循其他协议,NSObject是一个基础协议
@protocol LiuMangProtocol <NSObject,StudentProtocol>
//协议就是方法
@required //这个关键字代表下面的方法必须实现
-(void)eat; //吃
-(void)drink; //喝
@optional //这个方法代码可选实现
-(void)gamble; //赌
-(void)lie; //撒慌
@end
学生协议:
#import <Foundation/Foundation.h>
@protocol StudentProtocol <NSObject>
-(void)listener;
-(void)write;
@end
student协议:
#import <Foundation/Foundation.h>
@protocol StudentProtocol <NSObject>
-(void)listener;
-(void)write;
@end
我们创建一个对象Person来实现流氓协议和Person协议,当然必须要实现协议里面所有的方法(@required 必须实现的方法,@optional可选实现的借口);
Person的.h
#import <Foundation/Foundation.h>
#import "LiuMangProtocol.h"
#import "PersonProtocol.h"
#import "Car.h"
#import "CarProtocol.h"
//一个类可以同时遵循多个协议
//遵守哪个协议就要写在下面的< >中
@interface Person : NSObject<LiuMangProtocol,PersonProtocol>
//让Car遵循CarProtocol协议
@property(nonatomic,strong)Car<CarProtocol> *car;
//下面这种也行
@property(nonatomic,strong)id <CarProtocol> obj;
@end
Person的.m:实现各个协议的方法
#import "Person.h"
@implementation Person
-(void)eat
{
NSLog(@"流氓吃鸡蛋不吐葡萄皮");
}
-(void)drink
{
NSLog(@"流氓喝酒不给钱");
}
-(void)gamble
{
NSLog(@"流氓赌博老输钱");
}
-(void)lie
{
NSLog(@"流氓撒谎如放屁");
}
-(void)walk
{
NSLog(@"正常人走路");
}
-(void)listener
{
NSLog(@"学生听课");
}
-(void)write
{
NSLog(@"学生写字");
}
@end
我们创建一个 middleStudent 的类来继承 Person类,父类遵循了那些协议,子类同样遵循那些协议,只不过父类帮我们实现好了,我们拿过来用就行,当然middleStudent也可以创建自己私有的协议 ,如下
middleStudent 的.m文件
#import "Person.h"
//一个类的私有协议,也就是不需要许多类去遵守的协议,一个类特有的协议,我们可以把它直接再这个类的.h文件中直接声明出来,如下
@protocol middleStudentProtocol <NSObject>
-(void)sleep;
@end
//父类遵循了那些协议,子类同样遵循了那些协议
@interface middleStudent : Person<middleStudentProtocol>
@end
middleStudent 的.h文件,如果重写父类飞方法,那么会覆盖掉父类的方法
#import "middleStudent.h"
@implementation middleStudent
-(void)listener
{
NSLog(@"重写父类方法的学生听课");
}
-(void)sleep
{
NSLog(@"中学生特有的协议,睡觉");
}
@end
main函数
#import <Foundation/Foundation.h>
#import "Person.h"
#import "middleStudent.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
//创建一个person
Person *p = [[Person alloc]init];
[p eat];
[p drink];
[p walk];
//创建一个中学生
middleStudent *mid = [[middleStudent alloc]init];
[mid eat];
[mid listener];
//协议还有一种简便的书写方式,便于查看
//遵循协议的变量声明
//要求你创建的Person对象必须是遵循了personProtocol
//如果Person中没有实现PersonProtocol那么编译就会报错
Person<PersonProtocol> *p2 = [[Person alloc]init];
//下面这种方式也行,id,万能指针类型,能够存储任何的对象类型
id<PersonProtocol> obj = [[Person alloc]init];
}
return 0;
}
测试结果: