协议,委托与代理

一.协议

1.定义:

OC或者iOS中的协议:一组方法声明的列表,协议中不需要实现这些方法,谁遵守这个协议,谁就需要实现协议中的方法

2.协议创建的步骤

  • 制定协议的内容(方法声明列表)
  • 遵守协议(.h)
  • 实现协议中的方法(.m)
  • 调用协议中的方法

3.声明协议的关键字

(1)@required

表示必须实现的方法(默认)

(2)@optional

表示可以实现也可以不实现的方法

4.双向协议

程序举例
(1)ProtocolManToWoman.h文件

#import <Foundation/Foundation.h>

@protocol ProtocolManToWoman <NSObject>//基协议

- (void)white;
- (void)rich;
- (void)beautiful;

@optional
- (void)writeCode;

@end

(2)ProtocolWomanToMan.h文件

#import <Foundation/Foundation.h>

@protocol ProtocolWomanToMan <NSObject>

@required
- (void)height;
- (void)rich;
- (void)handsome;

@optional
- (void)writeCode;

@end

(3)Man.h文件

#import <Foundation/Foundation.h>
#import "ProtocolToMan.h"
@interface Man : NSObject <ProtocolToMan>

- (void)height;
- (void)rich;
- (void)handsome;
//- (void)writeCode;
@end

(4)Man.m文件

#import "Man.h"

@implementation Man

- (void)height{
    NSLog(@"I am so high....");
}

- (void)rich{
    NSLog(@"I am so rich....");
}

- (void)handsome{
    NSLog(@"I am very handsome...");
}

//- (void)writeCode{
//    NSLog(@"write hello world!....");
//}

@end

(5)Woman.h文件

#import <Foundation/Foundation.h>
#import "ProtocolToWoman.h"
@interface Woman : NSObject <ProtocolToWoman>

- (void)white;
- (void)rich;
- (void)beautiful;

//- (void)writeCode;

@end

(6)Woman.m文件

#import "Woman.h"

@implementation Woman

- (void)white{
    NSLog(@"white.....");
}

- (void)rich{
    NSLog(@"rich.....");
}

- (void)beautiful{
    NSLog(@"beautiful......");
}

//- (void)writeCode{
//    NSLog(@"writting code....");
//}
@end

(7)main文件

#import <Foundation/Foundation.h>
#import "Man.h"
#import "Woman.h"
int main(int argc, const char * argv[])
{

    @autoreleasepool {

        Man *man = [[Man alloc]init];
        if ([man respondsToSelector:@selector(height)]) {
            [man height];
        }
        if ([man respondsToSelector:@selector(rich)]) {
            [man rich];
        }
        if ([man respondsToSelector:@selector(handsome)]) {
            [man handsome];
        }
        if ([man respondsToSelector:@selector(writeCode)]) {
            [man writeCode];
        }
        else{
            NSLog(@"can not write code");
        }

        Woman *woman = [[Woman alloc]init];
        if ([woman respondsToSelector:@selector(white)]) {
            [woman white];
        }
        if ([woman respondsToSelector:@selector(rich)]) {
            [woman rich];
        }
        if ([woman respondsToSelector:@selector(beautiful)]) {
            [woman beautiful];
        }
        if ([woman respondsToSelector:@selector(writeCode)]) {
            [woman writeCode];
        }

    }
    return 0;
}

二.委托与代理

委托代理与正向传值程序举例
(1)ProtocolBossToWorker.h文件

#import <Foundation/Foundation.h>

@protocol ProtocolBossToWorker <NSObject>

- (void)driveCar:(int)time;

@end

(2)ProtocolWorkerToBoss文件

#import <Foundation/Foundation.h>

@protocol ProtocolWorkerToBoss <NSObject>

- (void)payMoney:(int)money;

@end

(3)Boss.h文件

#import <Foundation/Foundation.h>
#import "ProtocolBossToWorker.h"
#import "ProtocolWorkerToBoss.h"
@interface Boss : NSObject<ProtocolWorkerToBoss>

@property (retain,nonatomic)id <ProtocolBossToWorker>agent;
@property (assign,nonatomic)int timeOfDrive;

- (void)payMoney:(int)money;

- (void)getDrive;

@end

(4)Boss.m文件

#import "Boss.h"

@implementation Boss

- (void)payMoney:(int)money{
    NSLog(@"boss pay the money %d",money);
}

- (void)getDrive{
    if ([self.agent respondsToSelector:@selector(driveCar:)]) {
        [self.agent driveCar:_timeOfDrive];
    }
}

@end

(5)Worker.h文件

#import <Foundation/Foundation.h>
#import "ProtocolBossToWorker.h"
#import "ProtocolWorkerToBoss.h"
@interface Worker : NSObject<ProtocolBossToWorker>

@property (retain,nonatomic)id <ProtocolWorkerToBoss>agent;
@property (assign,nonatomic)int money;

- (void)driveCar:(int)time;

- (void)getPay;
@end

(6)Worker.m文件

#import "Worker.h"

@implementation Worker

- (void)driveCar:(int)time{
    NSLog(@"drive for %d hours",time);
    _money = time*5;
}

- (void)getPay{
    if ([self.agent respondsToSelector:@selector(payMoney:)]) {
        [self.agent payMoney:_money];
//        [self.agent payMoney:[self driveCar:self.boss.timeOfDrive]];
    }
}
@end

(7)main.m文件

#import <Foundation/Foundation.h>
#import "Boss.h"
#import "Worker.h"

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        Boss *boss = [[Boss alloc]init];
        Worker *worker = [[Worker alloc]init];
        boss.agent = worker;
        boss.timeOfDrive = 100;
        worker.agent = boss;
        [boss getDrive];
        [worker getPay];
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Story51314

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值