您的位置:首页 > 移动开发 > Objective-C

OC语法<3.3> OC中特有的语法:Protocol协议

2014-12-12 00:16 525 查看
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;
}


测试结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息