协议

作者: 蛐蛐_ | 来源:发表于2015-11-10 20:26 被阅读80次

main.m

#import <Foundation/Foundation.h>
#import "Girl.h"
#import "Boy.h"
int main(int argc, const char * argv[]) {
   
    Girl *zongru = [Girl girlWithName:@"zongru" gender:@"f"];
    Boy  *lol = [Boy boyWithName:@"luoluo" gender:@"m"];
    // 调用女孩类的_delegated的setter方法,将lol设置为女孩的代理
    [zongru setDelegated:lol];
    // 女孩饿了。
    [zongru hungry];
    [zongru poor];
    return 0;
}

Boy.h

#import <Foundation/Foundation.h>
#import "Girl.h"
// 我们在父类后使用尖括号+协议名的方式表示:该类遵守某协议
@interface Boy : NSObject  <YueFa>
{
    NSString *_name;
    NSString *_gender;
}

// 挣钱
- (void)makeMoney;
// 做饭
- (void)cook;

// 洗衣服
- (void)washing;
- (NSString *)name;
+ (instancetype)boyWithName:(NSString *)name gender:(NSString *)gender;
@end

Boy.m

#import "Boy.h"

@implementation Boy
- (instancetype)initWithName:(NSString *)name gender:(NSString *)gender{
    if ([super init]) {
        _name = name;
        _gender = gender;
    }
    return self;
}


//  男孩实现女孩协议中的方法
// 挣钱
- (void)makeMoney{
    NSLog(@"%@,我挣了500亿秘鲁币",_name);
}
// 做饭
- (void)cook{
    NSLog(@"%@,快来吃饭!",_name);
}

// 洗衣服
- (void)washing{
    NSLog(@"%@,我帮你洗白白",_name);
}

- (NSString *)name{
    return _name;
}
+ (instancetype)boyWithName:(NSString *)name gender:(NSString *)gender{
    return [[Boy alloc] initWithName:name gender:gender];
}
@end

Girl.h

#import <Foundation/Foundation.h>
@protocol YueFa <NSObject>

@required   //  使用@required修饰的方法是必须实现的方法,也是默认的状态
// 挣钱
- (void)makeMoney;
// 做饭
- (void)cook;
@optional   //  使用@optional修饰的方法,可以选择性的实现
// 洗衣服
- (void)washing;

@end
@interface Girl : NSObject
{
    NSString *_name;
    NSString *_gender;
    //  声明一个代理实例变量
    id <YueFa>_delegated;
    
    
}

// 给代理实例变量添加一个setter方法,就将那个宗儒的代理商:lol设置进实例变量中
- (void)setDelegated:(id <YueFa>)delegated;
- (NSString *)name;
+ (instancetype)girlWithName:(NSString *)name gender:(NSString *)gender;
// 宗儒饿了
- (void)hungry;
// 宗儒穷了
- (void)poor;
@end

Girl.m


#import "Girl.h"

@implementation Girl
-(instancetype)initWithName:(NSString *)name gender:(NSString *)gender{
    if (self =[super init]) {
        _gender = gender;
        _name = name;
    }
    return self;
}
- (NSString *)name{
    return _name;
}
+ (instancetype)girlWithName:(NSString *)name gender:(NSString *)gender{
    return [[Girl alloc]initWithName:name gender:gender];
}
// 实现_delegated的setter方法
- (void)setDelegated:(id<YueFa>)delegated{
    _delegated = delegated;
}
// 宗儒饿了
- (void)hungry{
    NSLog(@"我饿了!");
    // 女孩饿了,有代理去做饭
    [_delegated cook];
}

// 宗儒穷了
- (void)poor{
    NSLog(@"我穷了");
    [_delegated makeMoney];
}

@end

相关文章

  • git协议

    git支持的协议 local协议 https协议 ssh协议 git协议 github常用的协议

  • Dubbo服务 上传文件解决方案以及Hessian协议

    协议支持Dubbo支持多种协议,如下所示: Dubbo协议 Hessian协议 HTTP协议 RMI协议 WebS...

  • Procotol 和 Delegate

    目录 Procotol 协议的概念 协议的分类 协议的定义 协议的遵循 协议的方法 协议的属性 Delegate ...

  • 计算机网络题目

    几种协议分别属于哪一层传输层协议:TCP协议、UDP协议应用层协议:FTP、HTTP、SMTP网络层协议:IP协议...

  • ARP协议

    地址解析协议ARP 网络层四大协议:ARP协议,IP协议,ICMP协议,IGMP协议。 ARP(Address R...

  • IP数据报格式

    前言 先回顾一下TCP/IP协议栈 网络层的协议有IP协议、ARP协议、ICMP协议和IGMP协议。其中IP协议是...

  • 名词解析

    网络层:IP协议 : 网络协议ICMP协议: Internet互联网控制报文协议 ->IP协议的附属协议 IP...

  • 如何将Git仓库备份到本地

    git常用的传输协议传输协议.png哑协议:哑协议传输进度不可见;智能协议传输可见。传输速度:智能协议比哑协议传输...

  • NSURLSession学习笔记

    �Http协议-超文本传输协议 Http协议是应用层协议,底层要求的传输协议必须是可靠的传输协议,通常是TCP协议...

  • dubbo支持的7种协议 (1)

    支持的协议有哪些。 1、dubbo 协议 (默认) 2、rmi 协议 3、hessian 协议 4、http 协议...

网友评论

      本文标题:协议

      本文链接:https://www.haomeiwen.com/subject/lsjhhttx.html