OC学习之道:关于OC中的协议与代理模式,
2015-04-08 19:13
246 查看
不多说,直接上代码,所有的解释都注释在代码之中
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):
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
相关文章推荐
- 黑马程序员---OC学习笔记之利用协议实现代理模式
- 【OC学习-22】协议和代理双剑合璧——中介找房的代理模式
- iOS设计模式学习 (二) OC协议之接口继承和代理设计
- OC_语法入门_day6_ARC(循环引用)/block代码块(闭包)/protocol协议(接口)/代理模式
- OC学习篇之---代理模式
- 黑马程序员 oc随记 协议与代理模式
- 黑马程序猿_ 利用oc的协议实现代理模式
- OC 协议与代理模式
- 黑马程序员_ 利用oc的协议实现代理模式
- [oc学习日记]代理模式
- 黑马程序员--OC学习笔记之代理模式的简单分析
- OC学习 第九节 代理协议
- OC视频笔记5.4(协议的定义与使用)(代理设计模式)(代理设计模式思想)
- 黑马程序员-OC学习笔记-----协议、代理
- OC基础之 ---------- block / 代理模式 ,协议 /
- iOS开发篇——OC 协议和代理设计模式介绍
- OC中分类、类扩展、Block、协议(由协议引出的代理模式)
- 学习笔记:OC的protocol协议及代理设计模式
- 黑马程序员——OC学习——Protocol和代理设计模式
- [非凡程序员]OC设计模式:代理模式以及协议