Protocol 协议 与 delegate 代理

来源:互联网 发布:java资源下载网 编辑:程序博客网 时间:2024/04/30 03:37
 protocol
1.其实协议 Protocol 可以理解为生活中的合同,如果一个类要遵守这个协议,那么就要遵守协议中的内容,履行协议中的承诺
2.协议 只是 一个一个条款的声明(一堆方法的声明) ,声明应该去做的事,协议的实施是由承若遵守协议的类来实现
3.所制定的协议一般都要继承NSObject 协议 ,所以当一个类遵守了这个协议,就也要遵守NSObject 中的协议,NSObject 这个类实现了 NSObject 这个协议, NSObject 又是所有类的一个基类,所以 这个类就不用实现基类协议,只需实现现有协议.
4.如果你的父类实现了某个协议(protocol),子类也就默认遵循这个协议.
5.OC 中协议的定义@protocol的基本方式
  (1)声明协议  @Protocol MarryProtocol<NSObject>
                          - (void)makeMoney;
                        @optional
                         -(void)washcloth;
                         - (void)cook;
                      @end
     协议中的方法默认是必须实现的,@ required 关键字@ optional 修饰的方法是可选的.
  (2)遵守协议  只需要在父类名之后加上"<协议名称>"即遵守了这个协议
     #import "MarryProtocol"
          @interface Boy:NSObject<MarryProtocol>
         ............
@end
 
@implementation Boy
 ............//实现协议中的方法
@end
   (3) 可以通过用[对象名  conformToProtocol:@ protocol (协议名称)]来检查 这个类是否遵守了某项协议  返回值为 BOOL
   (4)一个类可以遵循多个协议
      @ interface Person:NSObject <MarryProtocol,WorkProtocol>
   (5)可以使用 [对象名 responseToSeletor:@SEL]来检查 这个类是否实现了某个方法.
2.自己的第一个代理 实例(结婚)
 
1.个人理解综述 :
(1)代理就是 自己不想去做的事情可以委托给另一个人 A去做,此时自己可以成为委托人, A就是代理人 ,代理你去做你不想做的事情.
(2)那么两个人之间应该有个协议,或者条款规定 代理人 应该为 委托人做什么事情 即两个人之间应该有个都知道的Protocol (两个类中都要声明这个协议Protocol)
(3)代理人要遵守这一份Protocol(即在代理人类中实现 Protocol 中的方法)  (4)委托人中要能够采用一定方式告知 代理人 去做 Protocol中的某件事 (即委托人类中 要创建一个遵守 此份协议的代理人的对象 ,通过此对象 去调用代理人 中实现的协议的方法 ,完成命令). 而委托人要向代理人发出命令, 委托人中就要有一个命令的方法( 委托人类中 要有一个方法 方法中是代理人调用协议方法).


2.委托的代码过程 ()

题目描述: 女方和男方达成协议,婚后赚钱,洗衣,做饭,带孩子的事都由男方全权代理.但是男方不想做,于是就请了一个保姆,将保姆作为一个代理,保姆可以帮助男孩洗衣,做饭,带孩子.此时男孩就只负责赚钱.
思路: 1.创建类Boy,Girl,Nurse 以及协议 MarrayProtocol, NurseProtocol其中 Nurse 遵守协议 NurseProtocol.  Boy 遵守 MarrayProtocol 协议.
     
2. Boy  添加代理人变量 能够指示保姆对象做事.
     
3. Girl 添加代理人变量,能够指示 Boy对象做事,而 Boy又通过自己的保姆代理做自己不想做的事.
---Girl.h
#import <Foundation/Foundation.h>
#import 
"MarryProtocol.h"

@interface Girl : NSObject

@property NSString *name;
@property NSString *gender;
@property id<MarryProtocol> marrayDelegate;
//女孩和男孩共同遵守 marryDelegate 协议,女孩创建一个结婚的代理人对象,这个对象遵守 MarryProtocol协议,以便去给代理人发出自己的指令

//初始化方法
- (
instancetype)initWithName:(NSString *)name1 gender:(NSString *)gender1;


//发出命令
- (
void)order:(NSInteger)ordernumber;
@end

---Girl.m
#import "Girl.h"

@implementation Girl

@synthesize name;
@synthesize gender;
@synthesize marrayDelegate;

- (
instancetype)initWithName:(NSString *)name1 gender:(NSString *)gender1
{
    
self=[super init];
    
if (self) {
        
name=name1;
        
gender=gender1;
    }
    
return self;
}

//发出命令
- (
void)order:(NSInteger)ordernumber
{
    
switch (ordernumber) {
        
case 1:
            [
marrayDelegate makeMonkey];//给代理发送命令,让代理去做自己协议中的事
            
break;
        
case 2:
            [
marrayDelegate makeFood];
            
break;
        
case 3:
            [
marrayDelegate washing];
            
break;
        
case 4:
            [
marrayDelegate lookChild];
            
break;
        
default:
            
break;
    }
}



@end

----Boy.h
#import <Foundation/Foundation.h>
#import 
"MarryProtocol.h"
#import 
"NurseProtocol.h"

@interface Boy : NSObject<MarryProtocol]]>


@property NSString *name;
@property NSString *gender;
@property id <NurseProtocol> nurseDelegate;
//男孩和保姆共同遵守 NurseProtocol 协议,男孩创建一个保姆的代理人对象,这个对象遵守 NurseProtocol协议,以便去给保姆代理人发出自己的指令 
//初始化方法
- (
instancetype) initWithName:(NSString *)name1 gender:(NSString *)gender1;

@end

----Boy.m
@implementation Boy

@synthesize name;
@synthesize gender;
@synthesize nurseDelegate;

//初始化方法
- (
instancetype) initWithName:(NSString *)name1 gender:(NSString *)gender1
{
    
self=[super init];
    
if (self) {
        
name=name1;
        
gender=gender1;
    }
    
return self;
}

- (
void)makeMonkey             //男孩实现协议中的方法
{
    
NSLog(@"%@去赚钱了,昨天的工资已全部上交!",name);
}
- (
void)makeFood
{
    [
nurseDelegate makeFood];// 接收到女孩发出的命令,然后又给自己的保姆代理发出命令,告诉代理人去做这件事
}

- (
void)washing
{
    [
nurseDelegate washing];
}

- (
void)lookChild
{
    [
nurseDelegate lookChild];
}
@end

----Nurse.h
#import <Foundation/Foundation.h>
#import 
"NurseProtocol.h"

@interface Nurse : NSObject<NurseProtocol]]]]>
@property NSString *name;

//初始化
- (
instancetype)initWithName:(NSString *)name1;
@end

----Nurse.m
#import "Nurse.h"

@implementation Nurse
@synthesize name;

//初始化
- (
instancetype)initWithName:(NSString *)name1
{
    
self=[super init];
    
if (self) {
        
name=name1;
    }
    
return self;
}

- (
void)makeFood        //保姆代理实现协议中方法
{
    
NSLog(@"%@我已经做好饭了",name);
}
- (
void)washing
{
    
NSLog(@"%@我已经洗好衣服了",name);
}

- (
void)lookChild
{
    
NSLog(@"%@我正在照看孩子",name);
}

@end

----MarryProtocol.h
#import <Foundation/Foundation.h>

@protocol MarryProtocol <NSObject]]]]>

- (
void)makeMonkey;
- (
void)washing;
- (
void)makeFood;
- (
void)lookChild;

@end

-----NurseProtocol.h
#import <Foundation/Foundation.h>

@protocol NurseProtocol <NSObject]]]]>

- (
void)makeFood;
- (
void)washing;
- (
void)lookChild;

@end



两个对象要先自己创建好自己的协议,(即两者都要知道有这个协议的存在).
委托方 要 有一个遵守协议的代理对象,并有一个方法去告诉代理要开始做某件事了.
代理方 要遵守双方创建的协议 (即要实现这个协议中的方法)

0 0
原创粉丝点击