您的位置:首页 > 其它

OC学习之道:关于OC中的协议与代理模式,

2015-04-08 19:13 246 查看
不多说,直接上代码,所有的解释都注释在代码之中
使用协议三步骤:
协议(Protocol):
1.要制定相应的协议(如:MarryProtocol)
2.遵守协议与设置代理(让代理对象所属类遵守协议)

3.在遵守协议的类中实现协议中的方法(就是哪个类遵守协议,就要哪个类实现这个协议中所声明的方法)

#pragma mark----protocol协议的使用
//协议就是定义了一组方法,然后让其他类去实现,接受协议的对象实现协议中定义的⽅方法。
//协议的定义格式:
/*
@protocol 协议名 <父协议>
定义方法
@end
*/
// 注:定义协议的关键字是@protocol,同时协议也是可以继承父协议的
/*
协议中定义的方法还有两个修饰符:
@required:这个表示这个方法是其他类必须实现的,也是默认的值
@optional:这个表示这个方法对于其他类实现是可选的
这个就和类似与Java中的抽象类了,如果是abstract修饰的就必须实现,所以如果一个协议中没有@optional修饰的方法,那么这个协议就相当于Java中的接口了。
这里要注意的是,上面的代码中NSObject不是我们之前说的NSObject类了,而是NSObject协议,他也是OC中第一个协议,这个名字相同在OC中是没有关系的。
*/

//创建协议文件是在cocoa的object-c Protocol项目下创建,生成一个.h文件,在.h文件里写需要实现的方法的
//
// main.m

// Copyright (c) 2015年 tongxing. All rights reserved.
//

#import
#import "Person.h"
#import "Human.h"
#import "Woman.h"
#import "Man.h"
int main(int argc, const char * argv[])
{

@autoreleasepool {
Woman *liuyifei =[[Woman alloc]initWithName:@"刘亦菲" Age:26 Man:nil];
Man *tongxing = [[Man alloc]initWithName:@"童星" Age:23 Woman:nil];

[tongxing setWoman:liuyifei];
[liuyifei setMan:tongxing];

[liuyifei hungry];

[liuyifei clothDirty];

[liuyifei digUnderWall];

[liuyifei setMan:nil];

[tongxing setWoman:nil];

Man *zhangfei = [[Man alloc]initWithName:@"张飞" Age:47 Woman:nil];

[liuyifei setMan:zhangfei];

[zhangfei setWoman:liuyifei];

[liuyifei hungry];

}
return 0;
}

//
// Human.h
// Copyright (c) 2015年 tongxing. All rights reserved.
//

#import

@interface Human : NSObject
@property NSString *name;
@property NSInteger age;

-(id)initWithName:(NSString *)name Age:(NSInteger)age;
@end

//
// MarryProtocol.h
// Copyright (c) 2015年 tongxing. All rights reserved.
//

#import

@protocol MarryProtocol
//协议就是一堆方法的声明
-(void)washClothes;

-(void)cook;

-(void)makeMoney;

-(void)studyExcavatorFromLanxiang;

-(void)digUnderWall;

-(void)hitDouDou;
@end

//
// Human.m
// Copyright (c) 2015年 tongxing. All rights reserved.
//

#import "Human.h"

@implementation Human

-(id)initWithName:(NSString *)name Age:(NSInteger)age{
if (self = [super init]) {
_name = name;
_age = age;
}
return self;
}
@end

//
// Woman.h
// Copyright (c) 2015年 tongxing. All rights reserved.
//

#import "Human.h"
#import "MarryProtocol.h"
@class Man;

@interface Woman : Human

//这里也要让声明的属性遵守协议
@property id man;

-(id)initWithName:(NSString *)name Age:(NSInteger)age Man:(Man*)man;

-(void)clothDirty;

-(void)hungry;

-(void)shopping;

-(void)digUnderWall;
@end

//
// Woman.m
// Copyright (c) 2015年 tongxing. All rights reserved.
//

#import "Woman.h"
#import "MarryProtocol.h"
@implementation Woman

-(id)initWithName:(NSString *)name Age:(NSInteger)age Man:(Man*)man{
self = [super initWithName:name Age:age];
if (self) {
_man = man;
}
return self;
}

-(void)clothDirty{

[_man washClothes];

}

-(void)hungry{
[_man cook];
}

-(void)shopping{
[_man makeMoney];
}

-(void)digUnderWall{
[_man studyExcavatorFromLanxiang];
}

@end

//
// Man.h
// Copyright (c) 2015年 tongxing. All rights reserved.
//

#import "Human.h"
#import "MarryProtocol.h"
@class Woman;
@interface Man : Human

@property Woman *woman;
//让Man这个类遵守MarryProtocol协议,导入协议的.h文件,然后父类后面加上

-(id)initWithName:(NSString *)name Age:(NSInteger)age Woman:(Woman*)woman;

@end

//
// Man.m
// Copyright (c) 2015年 tongxing. All rights reserved.
//

#import "Man.h"

@implementation Man
-(id)initWithName:(NSString *)name Age:(NSInteger)age Woman:(Woman*)woman{
self = [super initWithName:name Age:age];
if (self) {
_woman = woman;
}
return self;
}
-(void)cook{
NSLog(@"煮饭");
}

-(void)washClothes{
NSLog(@"洗衣服");
}

-(void)makeMoney{
NSLog(@"挣钱");
}
-(void)digUnderWall{
NSLog(@"挖墙脚");
}

-(void)studyExcavatorFromLanxiang{
NSLog(@"去蓝翔学习挖掘机");
}

-(void)hitDouDou{
NSLog(@"打豆豆");
}
@end
//
// main.m
// Copyright (c) 2015年 tongxing. All rights reserved.
//

#import
#import "Children.h"
#import "Nunny.h"
int main(int argc, const char * argv[])
{

@autoreleasepool {

Children *child = [[Children alloc]init];
Nunny *nunny = [[Nunny alloc]init];
[child setDelegate:nunny];//我想要设置谁做我的代理就可以设置,再来十几个类都是一样
[nunny wash:child];//然后该代理来实现我的方法

}
return 0;
}

//
// Nunny.h
// Copyright (c) 2015年 tongxing. All rights reserved.
//

#import
#import "Children.h"
@interface Nunny : NSObject

@end

//
// Nunny.m
// Copyright (c) 2015年 tongxing. All rights reserved.
//

#import "Nunny.h"

@implementation Nunny

-(void)wash:(Children *)childer{
NSLog(@"xixixi");
}
-(void)play:(Children *)childer{
NSLog(@"wanwanwan");
}

@end

//
// Children.h
// Copyright (c) 2015年 tongxing. All rights reserved.
//

#import

@class Children;
@protocol ChildrenDelegate

-(void)wash:(Children *)childer;//设置方法的对象是孩子类
-(void)play:(Children *)childer;

@end

@interface Children : NSObject{
id _delegate;//定义一个属性
}

//@property iddelegate;

-(void)setDelegate:(id)delegate;

@end

//
// Children.m
// Copyright (c) 2015年 tongxing. All rights reserved.
//

#import "Children.h"

@implementation Children

-(void)setDelegate:(id)delegate{
_delegate = delegate;
}

@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Protocol Delegate OC 继承