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
- OC之非正式协议总结
- OC学习之正式协议和非正式协议
- 分类之非正式协议
- OC的正式协议和非正式协议
- OC正式协议和非正式协议
- OC正式协议和非正式协议
- OC语言 非正式协议---类目&延展
- 黑马程序员---OC学习笔记之分类(Category)非正式协议【重点】
- OC正式协议和非正式协议的区别
- OC中的非正式协议与正式协议的区别
- OC之正式协议总结
- 非正式协议
- OC中类别的向前引用和非正式协议
- OC中的类目和延展以及非正式协议
- OC学习总结之延展类目协议
- OC协议-规范、协议与接口,使用类别实现非正式协议
- ios 开发之协议,非正式协议,委托(代理)区别
- 非正式协议/正式协议
- 解决git clone时报错:The requested URL returned error: 401 Unauthorized while accessing
- 详解大端模式和小端模式
- 最后那3分——ER模型到关系模型的转换
- 17.1.1.1 Setting the Replication Master Configuration
- Android进程级别与如何防止服务进程被回收
- OC之非正式协议总结
- USACO home on the range C 语言实现
- Unity3d中Shader的基本属性以及定义
- 字符串哈希到整数函数,算法
- Java实现字符串中的连续数字的反转
- windows下tomcat+solr+ZooKeeper集群搭建
- Android开发是sqlite数据库使用adb shell在cmd下查看
- JSON字符串解析(得到属性的值)
- HDU 4035 Maze