OC-协议

概念

我们之前讲过的非正式协议(NSObject的类目),那么就有一个正式协议。
在OC中,一个类可以实现多个协议,通过协议可以弥补单继承的缺陷,但是协议跟继承不一样,协议只是一个方法列表,方法的实现得靠遵循这个协议的类去实现。
协议:协议是一套标准,这个标准中声明了很多方法,但是不关心具体这些方法是怎么实现的,具体实现是由遵循这个协议的类去完成的。
例:
思路:假设现在有两个类student类和waiter类,我们设计一个场景即:当学生忙时,需要服务员送外卖上门;当学生不忙时,由学生自取。
1、在student类中写一条协议FoodProtocol,并增加一个送外卖的方法sendFood:

@protocol FoodProtocol<NSObject>
/*在方法声明的时候,可以有两个关键字去限制是否让遵循该协议的类去实现此方法,@required表示必须要实现(默认是required),@optional表示可选实现*/
@required
-(void)sendFood:(BOOL)flag;
//@optional
//-(void)sayHello;
@end

2、在sendFood中有传入一个BOOL值flag,这个参数用来判断学生的状态(忙=YES,不忙=NO)。所以需要在student类中增加一个flag属性:

@property(nonatomic,assign)BOOL flag;
//声明了一个必须实现协议的对象,使用assign,或者weak,可以防止循环引用
@property(nonatomic,assign)id<FoodProtocol>delegate;

3、接下来,需要实现一个setflag的方法,来通过设置flag的值 来调用sendFood方法

@implementation Student
-(void)setFlag:(BOOL)flag
{
    _flag=flag;
    //判断是否有代理,并且遵循定义的协议, conformsToProtocol方法确定了对象是否实现了某个协议
    if (self.delegate&&[self.delegate conformsToProtocol:@protocol(FoodProtocol)]) {
        [self.delegate sendFood:_flag];
    }
    else{
        NSLog(@"代理不存在");
    }
}

4、在waiter类中导入协议

#import "Student.h"
@interface Waiter : NSObject<FoodProtocol>
//实现协议内的方法
@end

5、实现协议中的方法

-(void)sendFood:(BOOL)flag
{
    if (flag) {
        NSLog(@"学生忙,我给你送外卖");
    }
   else
   {
       NSLog(@"学生不忙,你自己过来拿");
   }
}

6、然后在主函数中,进行验证:

 //创建两个对象
    Student *stu1=[Student new];
    Waiter *waiter=[Waiter new];
    //让waiter称为学生的代理
    stu1.delegate=waiter;
    stu1.flag=YES;

7、输出结果
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值