protocol的概念及基本的使用
protocol是正是协议(非正式协议:给NSObject或其子类增加新的方法的类),是一些方法的声明,用于
其他的类去遵守。如果一个类遵守了一个协议,就应该事先这个协议中必须要实现的方法
协议的话可以让某个类必须实现某个方法
接口(interface):在Java中,interface的概念只是一堆方法的声明,没有实现。而在OC里面,interface
是一个类的头文件的声明,并不是真正意义上的接口的意思,在OC中,接口是由一个叫做协议的
protocol来实现的。在protocol里面,与Java不同的是,他可以声明一些必须实现和选择实现的方法
这个和Java是完全不同的
protocol的使用流程
1.定义一个协议(.h文件)
@protocol 协议名称 <NSObject>//默认遵守NSObject协议
//方法的声明
@end;
2.在类中采用指定的协议(Class.h)
(1)类遵守协议
创建类的时候遵守某个或者几个协议
@interface 类名:父类 <协议名称>//创建的类遵守单个协议
@end
@interface 类名:父类 <协议名称1,协议名称2>//创建的类遵守多个协议
@end
3.实现协议中的方法,必选的和可选的方法(Class.m文件)
代码实例:
baseProtocol.h文件:
@protocol baseProtocol <NSObject>//默认采用NSObject,当然也可以不采用,直接@protocol baseProtocol
//声明一些方法
-(void)eat;
-(void)eat;
@end
Person.h文件://遵守baseProtocol协议
#import "baseProtocol"//引用头文件
@interface Person:NSObject<baseProtocol>
@end
Person.m文件://事先协议中的方法
#import “Person.h”
@inmplementation Person
-(void)run{
NSLog(@"人在跑步");
}
-(void)eat{
NSLog(@"人在吃饭");
}
main.m的文件
#import <Foundation/Foundation.h>
#import <Person.h>
int main(int argc,const char * argv[]){
@autoreleasepool{
Person *p = [Person new];
[p eat];//eat方法可以正常执行
[p run];//run方法可以正常执行
}
return 0;
}
protocol其他用法
1.protocol使用注意事项
(1)只是声明方法,不能生命成员变量。
(2)只要遵守的协议,就拥有了这个协议中的所有方法的声明
(3)只要父类遵守了某个协议,那么子类也遵守
(4)protocol声明的方法可以让任何类去实现
(5)OC不能继承多个类,但是可以能够遵守多个协议。
(6)基协议:<NSObject>是基协议,是最根本的的协议,其中生命了很多最基本的方法
(7)协议可以村收协议,一个协议遵守了另一个协议,就可以拥有了另一份协议中的方法的声明
2.协议之间的继承关系
A.h协议文件
#import <Foundation/Foundation.h>
@protocol A
方法
@end
B.h协议文件
#import <Foundation/Foundation.h>
#import B <NSObject,A>
@protocol B
方法
@end
3.类如果继承了协议后,该类的子类可以继承这些协议中的方法
4.protocol基协议
NSObject是一个基类,最根本的类,任何类最终都要继承它。它还有名字也叫NSObject的基协议,
他是一个基协议,最根本最基础的协议。NSPbject协议中声明很多最基本的方法description,retain
,release。建议每个新的协议都要继承该协议。
protocol中的@requierd和@optional
@requierd和@optional都是协议操作的关键字
@requierd------它作用域内的方法,必须要实现。默认情况下,也就是不加关键字的情况下,都是
必须摇实现的
@optional------它作用域内的方法,可以实现也可以不实现
protocol的类型限制
1.protocol类型限制问题
(1)第一种类型限制:给id类型增加限制
id<houseHold> obj = mm;//表示obj只能复制遵守了houseHold协议的对象。
(2)第二种:
Girl<houseHold> *obj2 = mm;//表示给obj2赋值的时候,必须是girl对象,并且遵守houseHold协议
(3)Girl<houseHold> *obj2 = mm;
obj2.dog = d;//dog对象遵守dog的某个协议。
protocol代理设计模式的引入
例子:保姆和婴儿的例子-------婴儿与保姆之间商定一个协议,协议中写明保姆需要做哪些事情。保姆需要
遵守该协议,于是保姆就要实现协议中的条款成为代理人。
1.代理设计模式的实现
(1)制定协议(照顾小孩的协议)
小孩想吃东西------保姆喂
小孩想睡觉---------保姆哄她睡觉
(2)创建相关类
婴儿类:属性+行为
保姆类:属性+行为
代码实现:
lookBabyProtocol.h协议文件
#import <Foundation/Foundation.h>
@protocol lookBabyProtocol <NSObject>//协议声明
-(void)feedBabyEat;//哄婴儿吃饭
-(void)HongBabySleep;//哄婴儿睡觉
@end
Baby.h头文件
#import <Foundation/Foundation.h>
@class "BaoMu.h"//避免循环引用问题
@interface Baby : NSObject
@property (nonatomic,strong) Baomu *bm;
-(void)wantEat;
-(void)wantSleep;
@end
Baby.m源文件
#import "Baby.h"
@implementation Baby
-(void)wantEat{
NSlog(@"baby在哭,想吃饭");
}
-(void)wantSleep{
NSlog(@"baby在哭,想睡觉");
}
BaoMu.h头文件
#import <Foundation/Foundation.h>
#import "lookBabyProtocol.h"
@interface BaoMu : NSObject<lookBabyProtocol>
@end
BaoMu.m源文件
import “BaoMu.h”
@implementation BaoMu
-(void)feedBabyEat{
NSlog(@"喂孩子吃饭");
}
-(void)HongBabySleep{
NSlog(@"哄孩子睡觉");
}
2.protocol代理设置模式概念
3.protocol代理模式应用场合
|
|