OC_09_02 协议

来源:互联网 发布:dbc2000修改传奇数据 编辑:程序博客网 时间:2024/06/08 02:23

在ViewContrller文件里

#import "ViewController.h"
#import "Student.h"
#import "Waiter.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    /*
       我们之前讲过非正式协议(NSObject的类目),那么肯定还有正式协议
     在OC中,一个类可以实现多个协议,通过多个协议可以弥补单继承的缺点,但是协议跟继承不一样,协议只是一个方法的列表,方法的实现得靠遵循该协议的类去完成.
     
     协议:协议是一套标准,这个标准里面声明了很多方法,但是不关心具体这些方法是怎么实现的,具体的实现是由遵循这个协议的类去完成的.
     */
    Student *student = [Student new];
    Waiter *waiter = [Waiter new];
    
    if ([waiter conformsToProtocol:@protocol(FoodProtocol)])
    {
        NSLog(@"waiter conforms FoodProtocol");
    }
    
    student.delegate = waiter;  //等于[waiter sendFool:YES]
    student.flag = YES;
    
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end


在Student.h文件里

#import <Foundation/Foundation.h>

//协议(正式协议) 用@protocol来定义
@protocol FoodProtocol <NSObject>
/*
 在方法声明时,可以有两个关键字去限制是否必须让遵循该协议的类去实现此方法.
 @required   标注的方法为必须实现的
 @optional   标注的方法可以选择实现
 */

@required
-(void)sendFool:(BOOL)flag;

@optional
-(void)sayHello;
@end



@interface Student : NSObject

@property(nonatomic,assign)BOOL flag;

//声明一个必须实现协议的对象,用assign为了防止循环使用
@property(nonatomic,assign)id<FoodProtocol>delegate;


@end


在Student.h文件里

#import "Student.h"

@implementation Student

//flag的设置器
-(void)setFlag:(BOOL)flag
{
    _flag = flag;
    
    //self.delegate  判断代理是否存在
    //- (BOOL)conformsToProtocol:(Protocol *)aProtocol; 它确定一个对象是否实现了某个协议
    if (self.delegate && [self.delegate conformsToProtocol:@protocol(FoodProtocol)])
    {
        [self.delegate sendFool:_flag];
    }
    else
    {
        NSLog(@"代理不存在");
    }
}

@end


在Waiter.h文件里

#import <Foundation/Foundation.h>
#import "Student.h"

//类实现协议的方法
@interface Waiter : NSObject<FoodProtocol>

@end


在Waiter.m文件里

#import "Waiter.h"

@implementation Waiter

-(void)sendFool:(BOOL)flag
{
    if (flag)
    {
        NSLog(@"学员忙,我们送餐");
    }
    else
    {
        NSLog(@"学员不忙,我不送餐");
    }
}

@end


0 0