【协议Protocol的类型限制 Objective-C语言】

一、例如,我有一个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