//
// ViewController.m
// OC-09_02
//
// Created by Ibokan on 15/12/21.
// Copyright © 2015年 ibokan. All rights reserved.
//
#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];
student.delegate = waiter;
student.flag = YES;
// if ([waiter conformsToProtocol:@protocol(FoodProtocol)]) {
// NSLog(@"waiter conforms FoodProtocol");
// }
// [waiter sendFood:student.flag];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
创建一个Student类
//
// Student.h
// OC-09_02
//
// Created by Ibokan on 15/12/21.
// Copyright © 2015年 ibokan. All rights reserved.
//
#import <Foundation/Foundation.h>
//协议 正式协议 @protocol 来定义
@protocol FoodProtocol <NSObject>
/*
在方法声明时,可以有两个关键字去限制是否必须让遵循该协议的类去实现次方法。
@required 标注的地方为必须实现的方法
@optional 标注的方法可以选择去实现
*/
@required
-(void)sendFood:(BOOL)flag;
@optional
-(void)sayHello;
@end
@interface Student : NSObject
@property (nonatomic,assign)BOOL flag;
//声明一个必须实现协议的对象
@property (nonatomic,assign)id<FoodProtocol>delegate;
@end
实现Student的属性和方法
//
// Student.m
// OC-09_02
//
// Created by Ibokan on 15/12/21.
// Copyright © 2015年 ibokan. All rights reserved.
//
#import "Student.h"
@implementation Student
//flag的设置器
-(void)setFlag:(BOOL)flag
{
_flag = flag;
//- (BOOL)conformsToProtocol:(Protocol *)aProtocol;//确定一个对象是否实现了某个协议
if (self.delegate && [self.delegate conformsToProtocol:@protocol(FoodProtocol)]) {
[self.delegate sendFood:_flag];
}
else
{
NSLog(@"代理不存在");
}
}
@end
创建一个Waiter类
//
// Waiter.m
// OC-09_02
//
// Created by Ibokan on 15/12/21.
// Copyright © 2015年 ibokan. All rights reserved.
//
#import "Waiter.h"
@implementation Waiter
-(void)sendFood:(BOOL)flag
{
if (flag) {
NSLog(@"学员忙,我们送餐");
}
else
{
NSLog(@"学员不忙,我们不送餐");
}
}
@end