使用协议三步骤:
协议(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 id delegate; -(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
OC学习之道:关于OC中的协议与代理模式,
最新推荐文章于 2022-08-02 15:32:21 发布
不多说,直接上代码,所有的解释都注释在代码之中