OC_11_2协议
来源:互联网 发布:淘宝快递多久自动售货 编辑:程序博客网 时间:2024/06/03 19:08
这节接着往下讲,还差一个协议,什么是协议呢?
◎我们之前讲过非正式协议(NSObject的类目),那么肯定还有正式协议。
◎在OC中,一个类可以实现多个协议,通过协议可以弥补单继承的缺陷。但是协议跟继承不一样,协议只是一个方法列表,方法的实现得遵循该协议的类去完成。
▶协议:协议是一套标准,这个标准里面声明了很多方法,但是不关心具体这些方法是怎么实现的,具体的实现是由遵循这个协议的类去完成的。
好的,老规矩,咱们先创建工程:
建立一个Student类和一个DeliveryMan类,咱们就来举一个”栗子”实现一个送货员送货上门,先去到Student.h文件:
//协议的定义 正式协议@protocol GoodsProtocol <NSObject>/** * 在方法声明的时候,可以有两个关键字去限制是否让遵循该协议的类去实现此方法 @required 标注的方法为必须实现的方法(默认的) @optional 标注的方法为可选实现的 */@required-(void)sendGoods:(BOOL)flag;@optional@end@interface Student : NSObject@property(nonatomic,assign)BOOL flag;//声明了一个必须实现的对象,使用assign/weak 为了防止循环引用@property(nonatomic,assign)id<GoodsProtocol> delegate; // 送货员 遵循GoodsProtocol协议@end
去到Student.m文件:
@implementation Student-(void)setFlag:(BOOL)flag{ _flag = flag; //conformToProtocol:确定了一个对象是否实现了某个协议 //如果代理存在并且代理遵循了某个协议 则执行相应方法 if(self.delegate &&[self.delegate conformsToProtocol:@protocol(GoodsProtocol)] ) { [self.delegate sendGoods:flag]; } else { NSLog(@"送货员代理不存在"); }}
去到DeliveryMan.h文件:
#import "Student.h"//实现协议里面的方法@interface DeliveryMan : NSObject <GoodsProtocol>@end
再去到DeliveryMan.m文件:
@implementation DeliveryMan-(void)sendGoods:(BOOL)flag //实现协议给的方法{ if(flag) { NSLog(@"我给你送货"); } else { NSLog(@"学生不忙,你自己过来拿"); }}
然后,回到ViewController.m文件:
- (void)viewDidLoad { [super viewDidLoad]; //创建Student的对象和DeliveryMan的对象 Student *s1 = [Student new]; DeliveryMan * d1 = [DeliveryMan new]; s1.delegate = d1;//我的理解是:将这送货员作为送货的代理;实际delegate是可更改的,我认为,这的意思就是特指此送学生货的送货员,感觉有点特指的意思。 s1.flag = YES;//bool返回yes,即进行判断}
输出:
若为NO,即:学生不忙,你自己过来拿
0 0
- OC_11_2协议
- 协议
- 协议
- 协议
- 协议
- 协议
- 协议
- 协议
- 协议
- 协议
- 协议
- 协议
- 协议
- 协议
- 协议
- 协议
- 协议
- 协议
- oracle中拼接sql过长的解决方法
- codeforces 703 A. Mishka and Game (水)
- JavaScript DOM操作记录
- 浅谈 Swift 柯里化(Currying)
- bzoj 4565: [Haoi2016]字符合并 (字符串dp)
- OC_11_2协议
- java监听器
- Robotium学习(六)-运行错误的解决方法
- Ext JS Data Package
- TESTNG组测试
- NS_ASSUME_NONNULL_BEGIN和NS_ASSUME_NONNULL_END
- unity中把材质截图当材质的matcap材质
- 《Java---Socket二进制通讯读取一行》
- (四)PHP注释,运算符