【协议protocol的基本使用 Objective-C语言】
移动开发
2022-10-03 21:40:56
阅读次数: 0
一、协议: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