17、OC 协议(protocol)

协议的作用与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
姓名:小明,年龄10

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值