【协议protocol的基本使用 Objective-C语言】

一、协议:protocol

1.协议protocol的作用:

一句话搞定协议的作用:

作用:1)专门用来声明一大堆方法。(不能声明属性,也不能实现方法,只能用来写方法的声明)。

2)只要某个类遵守了这个协议,就相当于拥有了这个协议中的所有的方法声明。

二、协议的声明:

@protocol 协议名称 < NSObject >

方法的声明:

@end

1.例如,在main.m文件中,点右键,选择New File,选择Objective-C File , 类型选择Protocol,名字写上MyProtocol,新建1个协议

2.新建1个协议的方式,NewFile OC-File - Protocol

3.协议的文件名:.h文件 并且只有1个.h文件

协议,是专门用来写方法的声明的,那还等什么,写吧!

在MyProtocol.h文件中:

#import <Foundation/Foundation.h>

@protocol MyProtocol < NSObject >

- (void)run;

- (void)sleep;

@end

这个时候,我是不是就在这个协议里写了两个方法啊

在协议中,只能用来声明方法,协议的作用,就是专门用来写方法声明的

好,是不是这样,我们来试一下,如果我在协议里写个属性呢,看看行不行

import <Foundation/Foundation.h>

@protocol MyProtocol < NSObject >

{

int _age;

}

- (void)run;

- (void)sleep;

@end

编译一下,发现它不报错,但是在main.m文件里引用一下:

#import <Foundation/Foundation.h>

#import “MyProtocol.h”

int main(){

return 0;

}

再编译一下试试,报错了# 三、协议天生就是用来被类遵守的

1.协议就是用来写方法声明的,就是用来被类遵守的。

2.例如,我定义一个Dog类

这个Dog类也想拥有协议中的run和sleep方法的声明

怎么办

第一种方式:自己写

第二种方式:我不想写,那就让它遵守这个协议,就可以了

3.如果想要让1个类,拥有协议中定义的所有方法的声明,那么就让这个类遵守这个协议

类只要遵守1个协议,那么这个类就拥有了这些协议中定义的所有方法的声明了

4.怎么让1个类遵守1个协议

@interface 类名:父类名 < 协议名称 >

@end

就可以了

例如,在Dog.h文件中:

#import <Foundation/Foundation.h>

#import “MyProtocol.h”

@interface Dog : NSObject < MyProtocol >

@end

这时候,Dog类就遵守了MyProtocol协议

遵守了协议,有什么效果呢

这时候,Dog类就拥有了MyProtocol协议中定义的所有方法的声明

我们来试一试啊,在Dog.m文件中:

#import “Dog.h”

@implementation Dog

- (void)run

{

NSLog(@“我皮啊皮啊的跑。”);

}

- (void)sleep

{

NSLog(@“我呼呼的睡。”);

}

@end

果然有run方法和sleep方法的声明了

在main.m文件中:

#import <Foundation/Foundation.h>

#import “Dog.h”

int main()

{

Dog *d1 = [Dog new];

[d1 run];

[d1 sleep];

return 0;

}

输出:

我皮啊皮啊的跑。

我呼呼的睡。

三、有人可能会问,你这个run方法和sleep方法有没有声明啊

1.有声明,我们刚刚说过,遵守一个协议,就相当于拥有了这个协议中所有方法的声明了吧,所以这个Dog类里面有run方法和sleep方法的声明,我在外面仍然可以调用啊

2.@interface Dog:NSObject < MyProtocol >

: 冒号表示继承 <> 尖括弧表示遵守1个协议

当一个类遵守一个协议,那么就相当于这个类 拥有了协议中定义的所有的方法的声明。

这个类只是拥有了这个协议中的方法的声明而已,没有实现,所以,这个类,就应该实现协议中的方法。

如果类不实现协议中的方法,编译不会报错,编译器只是会给你1个警告

但是当创建对象,来调用这个没有实现的协议中的方法的时候,就会报错。

四、类是单继承,但是协议可以多遵守

1.1个类只能有1个父类

2.但是,1个类可以同时遵守多个协议

3.例如,我这里还有一个协议YourProtocol

这个协议中,有一个eat方法

#import <Foundation/Foundation.h>

@protocol YourProtocol < NSObject >

- (void)eat;

@end

在Dog.h文件中

#import <Foundation/Foundation.h>

#import “MyProtocol”

#import “YourProtocol”

@interface Dog : NSObject < MyProtocol,YourProtocol >

@end

那我遵守两个协议,有什么效果呢

两个协议当中的所有方法的声明,它都有

在Dog.m文件中

#import “Dog.h”

@implementation Dog

- (void)run

{

NSLog(@“我皮啊皮啊的跑。”);

}

- (void)sleep

{

NSLog(@“我呼呼的睡。”);

}

- (void)eat

{

NSLog(@“真好吃。”);

}

@end

语法:

@interface 类名 :父类名 < 协议名称1,协议名称2,协议名称3,… >

@end

当1个类遵守了多个协议之后,就相当于这个类拥有了所有协议中定义的方法的声明

那么这个类,就应该实现所有协议中的方法

如果不实现,其实也不会报错,编译器只是会报警告

但是当创建对象,来调用这个没有实现的协议中的方法的时候,就会报错

猜你喜欢

转载自blog.csdn.net/madoca/article/details/127001011
今日推荐