Protocol 协议

来源:互联网 发布:云计算第三版刘鹏答案 编辑:程序博客网 时间:2024/06/05 01:22

protocol基本概念

  • 类似于java的接口interface,接口就是一堆方法的声明,没有实现,而在OC中interface是一个类的头文件的声明,并不是真正意义上的接口的意思,在OC中接口是由一个叫做协议的protocol来实现
  • protocol它可以声明一些必须实现的方法
  • protocol由一系列的方法声明组成

protocol 语法格式

  • protocol的定义
@protocol 协议名称//方法声明@end
  • 类遵守协议
    • 一个类可以遵循1个或多个协议
    • 任何类只要遵循了protocol就相当于拥有了protocol的所有的方法声明
@interface 类名:父类<协议1、协议2...>@end

protocol 和继承区别

  • 继承之后默认就有实现,而protocol只要声明没有实现
  • 相同类型的类可以使用继承,但是不同类型的类只能使用protocol
  • protocol可以用于存储方法声明,可以将多个类中共有的方法抽取出来,以后让这些类遵守协议即可

protocol注意事项

  • 协议只能声明方法,不能声明属性

    #import <Foundation/Foundation.h>//协议声明@protocol SportProtocol <NSObject>//方法声明-(void)playFootball;@end ******************************#import <Foundation/Foundation.h> #import "SportProtocol.h"// //遵守协议@interface Student : NSObject<SportProtocol>@end ******************************#import "Student.h"@implementation Student-(void)playFootball{NSLog(@"%s",__func__);}@end ******************************#import "Student.h"@implementation Student//协议实现-(void)playFootball{NSLog(@"%s",__func__);}@end
  • 父类遵守了某个类的协议,那么子类也会自动遵守这个协议

    #import <Foundation/Foundation.h>@protocol SportProtocol <NSObject>-(void)playFootball;@end ******************************#import <Foundation/Foundation.h>#import "SportProtocol.h"@interface Person : NSObject<SportProtocol>@end ******************************#import "Person.h"@interface Student : Person@end#import "Student.h"@implementation Student-(void)playFootball{    NSLog(@"%s",__func__);}@end
  • 一个类可以遵守多个协议

      #import <Foundation/Foundation.h> @protocol SportProtocol <NSObject> -(void)playFootball; @end      *************************** #import <Foundation/Foundation.h> @protocol StudyProtocol <NSObject> -(void)studyEnglish; @end      *************************** #import <Foundation/Foundation.h> #import "SportProtocol.h" #import "StudyProtocol.h" @interface Person : NSObject<SportProtocol,StudyProtocol> @end       ***************************   #import "Person.h" @implementation Person -(void)playFootball{     NSLog(@"%s",__func__); } -(void)studyEnglish{     NSLog(@"%s",__func__); } @end
  • 协议又可以遵守其他协议,只要一个协议遵循了其他协议,那么这个协议就会自动包含其他协议的声明

     #import <Foundation/Foundation.h>@protocol SportProtocol <NSObject>-(void)playFootball;@end          *************************** #import <Foundation/Foundation.h>#improt "SportProtocol.h"@protocol RunProtocl <SportProtocol>-(void)run;@end  *************************** #import "Person.h"@implementation Person-(void)playFootball{   NSLog(@"%s",__func__);}-(void)run{    NSLog(@"%s",__func__);}@end

基协议

  • NSObject是一个基类,任何其他类都要继承它
  • 还有个名字也叫NSObject的协议,它是一个基协议
  • NSObject协议中声明最基本的方法
    • description
    • retain
    • release
  • 建议每个新协议都遵循NSObject

    #import <Foundation/Foundation.h>@protocol StudyProtocol <NSObject>-(void)studyEnglish;@end

@required 和 @optional关键字

  • @required:这个方法必须实现,默认就是required(若不实现,编译会报错)
  • @optional:这个方法不一定要实现

    #import <Foundation/Foundation.h>@protocol StudyProtocol <NSObject>@required//必须实现-(void)studyChinese;@optional//不一定要实现-(void)studyEnglish;@end
0 0
原创粉丝点击