OC之非正式协议总结
2015-10-10 15:57
423 查看
前言:
在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中的正式协议。
相关文章推荐
- Objective-C的内省(Introspection)用法小结
- Objective-C中常用的结构体NSRange,NSPoint,NSSize(CGSize),NSRect实例分析
- Objective-C中NSNumber与NSDictionary的用法简介
- Objective-C中NSLog输出格式大全
- Swift调用Objective-C编写的API实例
- Swift、Objective-C、Cocoa混合编程设置指南
- Objective-c代码如何移植为Swift代码 Objective-c代码转移到Swift过程介绍
- Swift调用Objective-C代码
- 以实例讲解Objective-C中的KVO与KVC机制
- objective-c中生成随机数的方法
- 在Swift中使用Objective-C编写类、继承Objective-C类
- Swift能代替Objective-C吗?
- Objective-C 消息传递机制详解
- 在一个项目中同时使用Swift和Objective-C代码混合编程的方法
- vm安装mac os x 10.7 lion
- objective-c(一)
- objective-c(二)
- objective-c(三)
- objective-c(四)-基本数据类型以及循环和选择结构