【协议Protocol的类型限制 Objective-C语言】
移动开发
2022-10-03 21:40:51
阅读次数: 0
一、例如,我有一个StudyProtocol协议,学习协议,我还有一个Student类,这个类遵守了StudyProtocol协议
1.StudyProtocol.h文件如下:
#import <Foundation/Foundation.h>
@protocol StudyProtocol < NSObject >
- (void)study;
- (void)qiaoCode;
@end
Student.h文件中:
#import <Foundation/Foundation.h>
#import “StudyProtocol.h”
@interface Student : NSObject < StudyProtocol >
@end
Student.m文件中:
#import “Student.h”
@implementation Student
- (void)study
{
NSLog(@“我在学习”);
}
- (void)qiaoCode
{
NSLog(@“笔记看千遍,不如手敲一遍”);
}
@end
2.要求,现在要声明1个指针,这个指针可以指向任意的对象,但是要求指向的对象要遵守指定的协议
例如,请声明1个指针,这个指针可以指向任意的对象,但是要求指向的对象要遵守学习的协议StudyProtocol
如果不遵守,最起码要报1个警告
声明1个指针,可以指向任意的对象,那么只能是NSObject类型,或者id类型的指针
那先试试NSObject吧
在main.m文件中:
#import <Foundation/Foundation.h>
int main()
{
NSObject *obj = @“jack”;
return 0;
}
这么做能达到我们的要求吗,不能,这时候,它指向的这个对象有没有遵守学习协议啊,没有
那试试id类型的指针呢
id obj = @“jack”;
这个也不行吧,这时候,它指向的这个对象有没有遵守学习协议呢,没有
要求声明1个指针,指向1个遵守了学习协议的对象,否则最起码给报1个警告
语法:
NSObject< StudyProtocol > *obj;
这个指针什么类型的,是不是NSObject类型的啊,那么这个时候obj是不是就可以指向任意类型的Objective-C对象啊,但是我想让它指向的对象呢,要遵守学习协议,在后面加个尖尖,写上StudyProtocol,当然前面要把StudyProtocol.h引进来
在main.m文件中:
#import <Foundation/Foundation.h>
#import “StudyProtocol.h”
int main()
{
NSObject< StudyProtocol> *obj ;
return 0;
}
这个时候表示什么意思呢,第一,这个指针的类型是NSObject类型的,第二,要求这个指针指向的对象,要遵守学习协议
否则,编译器在编译的时候,就会报1个警告给你
例如,我来个@“jack”;
NSObject< StudyProtocol> *obj = @“jack”;
编译器就会报1个警告给我
那如果我来个[Student new]呢
NSObject< StudyProtocol> *obj = [Student new];
这就不会报警告了,因为Student类遵守了StudyProtocol协议
语法:
NSObject< 协议名称> *指针名;
这个时候,这个指针可以指向遵守了指定协议的任意对象,否则就会报1个警告
当然了,完全也可以使用id指针
例如:
id< StudyProtocol> id1 = @“jack”;
这个NSString类型的字符串有没有遵守协议啊,没有,于是报警告了
那我来个学生呢
id< StudyProtocol> id1 = [Student new];
语法:
id< 协议名称> 指针名;
3.我还有一个需求,例如,我这儿还有1个协议
SportProtocol
里面有1个方法: - (void)sport;
现在我要声明1个指针变量,要求这个指针变量指向的对象必须遵守多个协议
例如:
要求声明的指针变量指向的对象,必须要同时遵守学习协议和运动协议
在main.m文件中:
#import <Foundation/Foundation.h>
#import “Student.h”
#import “StudyProtocol.h”
#import “SportProtocol.h”
int main()
{
NSObject< StudyProtocol,SportProtocol> *obj1;
这时候,这个obj1就可以指向遵守这两个协议的任意对象都可以,
例如,我来一个[Student new];
符不符合要求,不符合,因为[Student new]学生只遵守了StudyProtocol协议,没有遵守SportProtocol协议
这时候,如果我让Student类再遵守一下Sport Protocol协议,再Student.h文件中
#import <Foundation/Foundation.h>
#import “StudyProtocol.h”
#import “SportProtocol.h”
@interface Student:NSObject < StudyProtocol,SprotProtocol>
@end
当然了,完全可以用id啊
例如:
id<StudyProtocol,SportProtocol> id2 = [Student new];
4.需求:定义1个指针,指向遵守了学习协议的学生对象
语法:
Student< StudyProtocol> *stu;
这时候,stu指针指向的对象,就必须是遵守了学习协议的学生对象
这时候,学生对象有没有遵守学习协议啊,有,所以stu这个指针,就可以指向学生对象,例如:
Student< StudyProtocol> *stu = [Student new];
5.那能不能指向学生类的子类呢
例如,我有一个StudentZiLei类,是学生类的子类,我能不能给stu指针赋1个StudentZiLei对象呢
在StudentZiLei.h文件中
#import <Foundation/Foundation.h>
#import “Student.h”
@interface StudentZiLei : Student
@end
在main.m文件中:
#import <Foundation/Foundation.h>
#import “StudyProtocol.h”
#import “SportProtocol.h”
#import “StudentZiLei.h”
int main() {
Student< StudyProtocol> *stu2 = [StudentZiLei new];
return 0;
}
可不可以,会不会报警告,不会,因为StudentZiLei的父类,是遵守学习协议的,所以子类也遵守学习协议
二、为什么要让指针指向的对象遵守StudyProtocol学习协议呢
1.因为接下来,我要调用id1的study方法
例如,在main.m文件中:
#import <Foundation/Foundation.h>
#import “StudentZiLei.h”
#import “SportProtocol.h”
#import “StudyProtocol.h”
int main(){
id< StudyProtocol> id1 = [StudentZiLei new];
[id1 study];
return 0;
}
2.遵守了某个协议的类,就相当于拥有了这个协议所定义的行为
因为我要调用这个对象中的协议方法
只有类遵守了协议,这个类中一定才会有协议方法
所以,为了保证id1指向的对象,一定有学习方法,所以,我要求id1指向的对象,要遵守学习协议
为什么我要让它有学习协议呢,因为我马上要调用学习方法
你想想,如果这个对象不遵守学习协议的话,这个对象里面,就有可能没有学习方法
转载自blog.csdn.net/madoca/article/details/127061974