黑马程序员****OC语言基础****protocol概念和理解

本文详细介绍了Java培训中的协议设计模式,包括非正式协议、接口与协议的区别,以及如何在类中采用协议并实现协议方法。通过案例分析,展示了协议在实际编程中的应用,如保姆照顾婴儿的代理模式设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

       非正式协议:

                     非正式协议就是给NSObject类创建的类目(分类)又叫做非正式协议, 非正式协议一般不需要进行实现,一般在子类中进行方法的重写。 

       protocol:

                     接口就是一堆方法的声明没有实现,而在OC里面,Interface是一个类的头文件的声明,并不是真正意义上的接口的意思,在OC中,接口是由一个叫做协议的protocol来实现的。 

      协议的使用流程:

                     定义协议----> 在类中采用指定的协议---->实现协议中的方法(注意方法有必须实现和选择实现两种) 

       协议的定义:


<span style="font-size:24px;">@protocol 协议名称 <NSObject>//默认遵守NSObject协议
//方法声明列表
@end; </span>

      基本使用:

workProtocol.h


<span style="font-size:24px;">#import <Foundation/Foundation.h>

@protocol workProtocol <NSObject>
-(void)work;
@end</span>

baseProtocol.h


<span style="font-size:24px;">#import <Foundation/Foundation.h>

@protocol baseProtocol <NSObject>
-(void)eat;
-(void)run;
@end</span><span style="font-size: 14.399999618530273px;">
</span>

Person.h


<span style="font-size:24px;">#import <Foundation/Foundation.h>
#import "workProtocol.h"
#import "baseProtocol.h"
@interface Person : NSObject<workProtocol,baseProtocol>

@end</span>

Person.m


<span style="font-size:24px;">#import "Person.h"

@implementation Person
-(void)eat{
    NSLog(@"人在吃");
}
-(void)run{
    NSLog(@"人在努力疯跑");    
}
-(void)work{
    NSLog(@"人在拼了命的赚钱");
}
@end</span>

main.m


<span style="font-size:24px;">#import <Foundation/Foundation.h>
#import "Person.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *p = [Person new];
        
        [p run];
        [p work];
        [p eat];
        
        
    }
    return 0;
}</span>

        运行结果:人在努力疯跑

                          人在拼了命的赚钱

                          人在吃


   

protocol代理设计模式 :

         传入的对象,代替当前类完成了某个功能,称为代理模式。        

实例分析:保姆照顾婴儿

baomuProtocol.h


#import <Foundation/Foundation.h>
#import "Baby.h"
@protocol baomuProtocol <NSObject>

//喂宝宝吃饭
-(void)feedBaby:(Baby *) baby;
//哄宝宝睡觉
-(void)sleepBaby:(Baby *) baby;

@end

Baby.h


#import <Foundation/Foundation.h>
//#import "baomuProtocol.h"
@class Baomu;
@interface Baby : NSObject
@property (nonatomic,strong)Baomu *BM;
@property (nonatomic,assign)float blood;
@property (nonatomic,assign)float sleep;

//宝宝的行为,不过只会哭
-(void)wantEat;
-(void)wantSleep;

@end

Baby.m


#import "Baby.h"
#import "Baomu.h"
@implementation Baby

//宝宝的行为,不过只会哭

-(void)wantEat{
    
    NSLog(@"宝宝在哭。。。");
    [self.BM feedBaby:self];
}

-(void)wantSleep{
    
   NSLog(@"宝宝在哭。。。");
    [self.BM sleepBaby:self];
}

@end

Baomu.h


#import <Foundation/Foundation.h>
#import "baomuProtocol.h"
//@class Baby;
@interface Baomu : NSObject<baomuProtocol>

@end

Baomu.m


#import "Baomu.h"
#import "Baby.h"
@implementation Baomu
//喂宝宝吃饭
-(void)feedBaby:(Baby *) baby{
    baby.blood += 29;
    NSLog(@"保姆正在喂宝宝喝奶粉!");
    NSLog(@"baby.blood = %.2f",baby.blood);
}
//哄宝宝睡觉
-(void)sleepBaby:(Baby *) baby{
    baby.sleep += 13;
    NSLog(@"保姆正在哄宝宝睡觉觉!");
    NSLog(@"baby.blood = %.2f",baby.sleep);
}

@end

main.m


#import <Foundation/Foundation.h>
#import "Baby.h"
#import "Baomu.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Baby *baby = [Baby new];
        Baomu *baomu = [Baomu new];
        baby.BM = baomu;
        baby.blood = 5;
        baby.sleep = 3;
        [baby wantEat];
        [baby wantSleep];
        
        
        
    }
    return 0;
}

        运行结果:宝宝在哭。。。

                             保姆正在喂宝宝喝奶粉!

                             baby.blood = 34.00

                             宝宝在哭。。。

                             保姆正在哄宝宝睡觉觉!

                             baby.blood = 16.00







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值