Objective-C关于协议protocol与代理degelate以及protocol的类型限制

在学习oc的过程中,协议以及代理的概念遇上一些问题,现在终于理清了,所以在这里分享下

先看下概念:

  • Protocol翻译过来, 叫做”协议”

    • 在写java的时候都会有接口interface这个概念,接口就是一堆方法的声明没有实现,而在OC里面Interface是一个类的头文件的声明,并不是真正意义上的接口的意思,在OC中接口是由一个叫做协议的protocol来实现 的
    • protocol它可以声明一些必须实现的方法和选择实现 的方法。这个和java是完全不同的
  • Protocol的作用

    • 用来声明一些方法
    • 也就说, 一个Protocol是由一系列的方法声明组成的
学习的前期一直把OC中的@interface当作是接口,因为跟java很类似,interface声明再去实现,然而实际却是不一样的。OC中的@interface和@implemention加起来才相当于java中的class类,而实际上OC中的@protocol才相当于java中的interface。在OC中@interface又称为非正式协议(接口),protocol称为正式协议(接口)


假设我们要踢球,运动员有踢的动作,然后球就会飞起来

分析下,这应该包含两个类,运动员和球,运动员踢球的动作就相当于委托代理球自己飞起来,踢的动作相当于一个出发点。

首先,我们需要创建一个协议,Command+N,选择Objective-C File,File Type选择protocol。

这是协议myProtocol的文件

#import <Foundation/Foundation.h>

//定义一个协议

@protocol footballProtocol <NSObject>

//协议不能包含成员变量

//定义协议方法

@required

//required关键字表示该方法必须实现,不实现不会报错但是会报警告,默认是required

-(void)fly;


@optional

//optional表示该方法可以选择实现或者不实现,不会报错不会报警告也

-(void)goalScore;

@end

有了协议,咱们就需要类来去遵守这个协议,相当于java中定义了interface接口就要有implementation实现接口

接下来创建球类Command+N 选择cocoa class

定义球类ball的声明文件

#import <Foundation/Foundation.h>

#import "footballProtocol.h"

//声明类ball遵守协议footballProtocol

@interface ball : NSObject<footballProtocol>

//声明球类旋转的方法

-(void)rotate;

@end

实现协议myProtocol和ball非正式协议自身的方法,在ball.m中去操作

#import "ball.h"


@implementation ball

//ball自身的方法

-(void)rotate{

    NSLog(@"我转,我一直转!!!");

}

//遵守协议实现的方法

-(void)fly{

    NSLog(@"飞向球门,go!!!");

}

-(void)goalScore{

    NSLog(@"进球啦,得分了!!!");

}

@end

接下来我们应该创建运动员类player,player类要让球类ball替自己去完成飞的动作,首先就需要也遵守footballProtocol协议,还需要设置属性返回一个遵守该协议的对象,注意,delegate并不是关键词,可以用其他单词。

#import <Foundation/Foundation.h>

#import "footballProtocol.h"

//定义player遵守footballProtocol协议

@interface player : NSObject<footballProtocol>

//设置属性 要遵守协议的对象

@property(nonatomic,strong) id<footballProtocol> delegate;

//player自身的方法

-(void)eat;

@end

player类同样遵守协议,对于协议中@required的方法必须实现,下面是player.m文件

#import "player.h"

@implementation player


@synthesize delegate=_delegate;


-(void)eat{

    NSLog(@"踢球要补充能量,赶紧吃吃吃!!!");

}

//实现方法 通过代理去调用ball实现的方法

-(void)fly{

    [_delegate fly];

}

-(void)goalScore{

    [_delegate goalScore];

}

@end

最后的main文件是见证奇迹的时刻

#import <Foundation/Foundation.h>

#import "ball.h"

#import "player.h"


int main(int argc, const char * argv[]) {

    @autoreleasepool {

        // insert code here...

        //实例化对象并初始化

        ball *b=[[ball alloc]init];

        player *p=[[player alloc]init];

        //设置代理

        p.delegate=b;

        [p eat];

        [p fly];

        [b rotate];

        //代理对象的方法只能自己去调用

        [p goalScore];

      

    }

    return 0;

}

运行的结果如图




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值