您的位置:首页 > 移动开发 > Objective-C

17、OC 协议(protocol)

2014-12-09 17:10 211 查看
协议的作用与Java中接口的作用非常类似,用于定义类应该遵守的规范,协议不提供实现,只定义规范。协议中定义多个类的公共行为规范,协议通常定义一组公用方法,方法的实现交给类去完成。
协议的基本语法格式如下:
@protocol 协议名 <父协议1,父协议2...>
//协议方法

@end

协议支持多继承,可以看到上面的语法格式,多个父协议放在<>中,子协议继承父协议会得到父协议的所有方法。
协议的方法需要类去实现,如果类没有实现则会发出警告,但是我们有时定义的协议方法,类并不一定要去实现,OC为我们想到了这一点,通过@optional和@required两个关键词就可以做到。
@required:默认行为,实现类必须实现这些方法,如果没有实现,编译器会提示警告。
@optional:实现类可以实现这些方法,也可以不实现。

@protocol 协议名 <父协议1,父协议2...>
//协议方法
@optional
//可选的协议方法
//...
@required

//必须实现的协议方法
//...

@end

实现协议:在类接口定义时需要指明继承的父类,在后面可以指定要实现的协议,实现协议的格式如下:
@interface 类名 :
父类 <协议1,协议2...>

@end

下面看一个例子
定义一个协议(PrintProtocol.h)
<span style="font-size:18px;">#import <Foundation/Foundation.h>
@protocol PrintProtocol
//协议方法
@optional
-(void)printName;
@required
-(void)printMessage;
@end
</span>


定义一个Student类 实现协议PrintProtocol

<span style="font-size:18px;">#import <Foundation/Foundation.h>
#import "PrintProtocol.h"
@interface Student : NSObject <PrintProtocol>
@property (nonatomic,copy)NSString* name;
@property (nonatomic,assign)int age;
@end

#import "Student.h"
@implementation Student
-(void)printName{
NSLog(@"我的名字是:%@",_name);
}

-(void)printMessage{
NSLog(@"姓名:%@,年龄%d",_name,_age);
}
@end</span>


OC中的协议也可以想Java接口一样定义变量,定义变量的可以有以下2种语法:
NSObject<协议1,协议2...>* 变量;
id<协议1,协议2...> 变量;

下面我们测试协议的使用:
<span style="font-size:18px;">#import <Foundation/Foundation.h>
#import "Student.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Student* stu = [[Student alloc]init];
[stu setName:@"小明"];
[stu setAge:10];
//调用实现的协议的方法
[stu printName];
[stu printMessage];

//使用NSObject的方式创建一个协议对象
NSObject<PrintProtocol>* op = stu;
//使用协议对象调用协议方法
[op printMessage];
//使用id的方式创建一个协议对象
id<PrintProtocol> ip = stu;
//使用协议对象调用协议方法
[ip printMessage];
}
}</span>


输出结果:
我的名字是:小明
姓名:小明,年龄10
姓名:小明,年龄10
[b]姓名:小明,年龄10[/b]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息