OC之非正式协议总结

来源:互联网 发布:ubuntu第一次怎么进入 编辑:程序博客网 时间:2024/06/08 19:23

前言:

在OC中非正式协议用的不多。

1.Demo解释:

写了一个demo,就是老板要出差去上海,于是就会派遣员工去张罗着件事,买机票,买水和食物,还要处理走之前公司的事情。老板如果自己做,这些代码就要实现在自己的代码里面,但是如果把这些方法声明在协议里面,就减少了代码的耦合度,任何人都可以做这些事情,老板只需要指定某个实现该协议的人去做就ok了,随时可以裁员,换人。我们可以使用正式协议也可以使用非正式协议,这里我先写一个非正式协议的demo.

2.Demo结构及代码:

OC-非正式协议demo

main.m
#import <Foundation/Foundation.h>#import "Boss.h"#import "Employee1.h"#import "Employee2.h"#import "Employee3.h"int main(int argc, const char * argv[]) {    @autoreleasepool {        Boss *boss=[[Boss alloc] init];        Employee1 *e1=[[Employee1 alloc] init];        Employee2 *e2=[[Employee2 alloc] init];        Employee3 *e3=[[Employee3 alloc] init];        boss.delegate=e1;        [boss buyTickets];//让员工1去买机票        boss.delegate=e2;        [boss buyWaterAndFoods];//让员工2去买食物和水        boss.delegate=e3;        [boss dealWithThings];//让员工3去处理老板走之前的事情    }    return 0;}
Extension
NSObject_Prepare.h
//《Prepare协议》// 注意1:非正式协议只用来扩展NSObject类,通常所说的OC中的扩展就是非正式协议// 注意2:非正式协议中声明的方法是可选实现的,可以只实现一部分// 注意3:非正式协议使用委托的时候只需要将委托的类型声明成id类型就可以了,不用声明具体遵守哪一个协议// 委托对象的类.h文件中只需要导入协议文件,然后在自己的.m文件中实现需要实现的方法就可以了,不用再次声明了#import <Foundation/Foundation.h>@interface NSObject ()//在Employee1中只实现了前两个方法,第三个方法没有实现-(void)buyTickets;-(void)buyWaterAndFoods;-(void)culPrices;@end
NSObject_Deal.h
//《Deal协议》#import <Foundation/Foundation.h>@interface NSObject ()-(void)dealWithThings;//处理事情的方法@end
Interface
Boss.h
#import <Foundation/Foundation.h>#import "NSObject_Prepare.h"//导入协议#import "NSObject_Deal.h"//导入协议@interface Boss : NSObject@property(nonatomic,assign)id delegate;//非正式协议委托人-(void)gotoShangHai;@end
Boss.m
#import "Boss.h"@implementation Boss-(void)gotoShangHai{    NSLog(@"我要去上海开会");}#pragma mark - NSObject_Prepare协议-(void)buyTickets{//    NSLog(@"我自己买了往返机票");//原来需要自己去做的事情,接下来要交给委托人去做    if ([_delegate respondsToSelector:@selector(buyTickets)]) {        [_delegate buyTickets];//调用委托对象的买票方法    }}-(void)buyWaterAndFoods{//    NSLog(@"我自己买了水和食物");//原来需要自己去做的事情,接下来要交给委托人去做    if ([_delegate respondsToSelector:@selector(buyWaterAndFoods)]) {        [_delegate buyWaterAndFoods];//调用委托对象的买票方法    }}#pragma mark - NSObject_Deal协议-(void)dealWithThings{//    NSLog(@"我得在走之前把要处理的事情都处理好");//原来需要自己去做的事情,接下来要交给委托人去做    if ([_delegate respondsToSelector:@selector(dealWithThings)]) {        [_delegate dealWithThings];//调用委托对象的处理事情方法    }}@end
Employee1.h
#import <Foundation/Foundation.h>#import "NSObject_Prepare.h"//步骤1@interface Employee1 : NSObject@end
Employee1.m
#import "Employee1.h"@implementation Employee1//步骤2 只要在这里实现buyTickets方法就可以-(void)buyTickets{    NSLog(@"我是员工1,我负责买往返机票");}@end
Employee2.h
#import <Foundation/Foundation.h>#import "NSObject_Prepare.h"//步骤1 导入协议@interface Employee2 : NSObject@end
Employee2.m
#import "Employee2.h"@implementation Employee2//步骤2 实现协议中的方法-(void)buyWaterAndFoods{    NSLog(@"我是员工2,我负责买食物和水");}@end
Employee3.h
#import <Foundation/Foundation.h>#import "NSObject_Deal.h"//步骤1 导入协议@interface Employee3 : NSObject@end
Employee3.m
#import "Employee3.h"@implementation Employee3//步骤2 实现方法-(void)dealWithThings{    NSLog(@"我是员工3,我负责处理老板走之前的事情");}@end

3.Demo运行结果:

这里写图片描述

总结:

非正式协议用的不多,因为如果是对类的扩充的话,可以使用类别category,虽然这样只能扩充方法不能扩充属性;如果是单纯把方法独立出来实现,完成多继承的功能,可以使用正式协议。
下一篇是OC中的正式协议。

0 0