在OC语言中,协议是一组方法,里面有两种方法,一种是遵守这个协议的类的实例必须实现的方法,另一种是可以实现也可以不实现的方法。
例如我定义一个学生的协议,这个协议里有两个方法,其中一个是必选的方法;学生上学,另一个是可选方法,学生学习。只要是学生,不管大学生,中学生,小学生,只要遵守这个协议,都必须实现学生协议中的必选方法,也就是学生上学的方法。
协议中只声明方法,不需要实现方法。方法的实现在遵守这个协议的类的.m文件中实现。
以下是Student协议的定义:
1 #import <Foundation/Foundation.h> 2 3 //协议所遵守的基协议是NSObject 4 @protocol Student <NSObject> 5 6 //定义必选方法 7 @required 8 -(void)gotoschool; 9 10 //定义可选方法 11 @optional 12 -(void)study; 13 14 @end
以下是大学生类的.h文件
1 #import <Foundation/Foundation.h> 2 3 //导入学生协议头文件 4 #import "Student.h" 5 6 //声明大学生类,遵守的student协议用<>括起来 7 @interface academician : NSObject <Student> 8 9 @end
以下是大学生类的.h文件:
1 #import "academician.h" 2 3 @implementation academician 4 5 //实现student协议中规定的必须实现的方法 6 -(void)gotoschool{ 7 NSLog(@"大学生去上学"); 8 } 9 10 @end
以下是另一个遵守student协议的类:小学生类的.h文件:
1 #import <Foundation/Foundation.h> 2 #import "Student.h" 3 @interface pupil : NSObject <Student> 4 5 @end
小学生类的.m文件:
1 #import "pupil.h" 2 3 @implementation pupil 4 5 -(void)gotoschool{ 6 NSLog(@"小学生去上学"); 7 } 8 9 @end
以下是主函数:
1 #import <Foundation/Foundation.h> 2 //包含大学生类头文件 3 #import "academician.h" 4 //包含小学生类头文件 5 #import "pupil.h" 6 7 int main(int argc, const char * argv[]) { 8 9 // 实例化一个大学生对象 10 academician *daxuesheng = [[academician alloc]init]; 11 // 大学生对象遵守student协议中的gotoschool方法 12 [daxuesheng gotoschool]; 13 14 // 实例化一个小学生对象 15 pupil *xiaoxuesheng = [[pupil alloc]init]; 16 // 小学生对象遵守student协议中的gotoschool方法 17 [xiaoxuesheng gotoschool]; 18 19 return 0; 20 }
注意:在以上例程中,student协议中的可选方法study没有被实现,这是可以的,但是必选方法gotoschool一定要被实现。