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"];
// 調(diào)用女孩類的_delegated的setter方法忠藤,將lol設(shè)置為女孩的代理
[zongru setDelegated:lol];
// 女孩餓了顷蟆。
[zongru hungry];
[zongru poor];
return 0;
}
Boy.h
#import <Foundation/Foundation.h>
#import "Girl.h"
// 我們?cè)诟割惡笫褂眉饫ㄌ?hào)+協(xié)議名的方式表示:該類遵守某協(xié)議
@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;
}
// 男孩實(shí)現(xiàn)女孩協(xié)議中的方法
// 掙錢
- (void)makeMoney{
NSLog(@"%@,我掙了500億秘魯幣",_name);
}
// 做飯
- (void)cook{
NSLog(@"%@衰絮,快來(lái)吃飯!",_name);
}
// 洗衣服
- (void)washing{
NSLog(@"%@咆畏,我?guī)湍阆窗装?,_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修飾的方法是必須實(shí)現(xiàn)的方法燃异,也是默認(rèn)的狀態(tài)
// 掙錢
- (void)makeMoney;
// 做飯
- (void)cook;
@optional // 使用@optional修飾的方法,可以選擇性的實(shí)現(xiàn)
// 洗衣服
- (void)washing;
@end
@interface Girl : NSObject
{
NSString *_name;
NSString *_gender;
// 聲明一個(gè)代理實(shí)例變量
id <YueFa>_delegated;
}
// 給代理實(shí)例變量添加一個(gè)setter方法夯膀,就將那個(gè)宗儒的代理商:lol設(shè)置進(jìn)實(shí)例變量中
- (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];
}
// 實(shí)現(xiàn)_delegated的setter方法
- (void)setDelegated:(id<YueFa>)delegated{
_delegated = delegated;
}
// 宗儒餓了
- (void)hungry{
NSLog(@"我餓了诗充!");
// 女孩餓了,有代理去做飯
[_delegated cook];
}
// 宗儒窮了
- (void)poor{
NSLog(@"我窮了");
[_delegated makeMoney];
}
@end