协议(Protocol)

原创 2015年07月06日 23:14:25

Objective-C中的协议与Java、C#中的接口以及C++中的抽象类相类似,用于定义公共接口,并承诺类需要实现协议中规定的方法。
使用协议的最大好处就是它能够有效扩展程序的功能。举几个简单的例子,通用串行总线程(Universal Serial Bus,USB)就是一个协议,它能够让计算机周边设备连接标准化。现在的计算机都配备了USB接口,这样能够有效扩展计算机的功能。USB接口协议定义了接口尺寸、电压极性、电流大小、针脚位置等规范,只要设备符合USB协议就可以直接插入到计算机中使用。至于设备的具体作用可以由设备的生产厂家自己定义,例键盘、鼠标、游戏手柄、移动硬盘等。
Java、C#接口、C++抽象类要求实现它的非抽象类必须实现它规定的方法,而Objective-C中的协议更加灵活,它规定哪些方法必须实现,哪些方法可以有选择地实现。

1.声明协议

首先我们看一下如何创建协议。例如,我们希望通过一个协议来限制宠物应该满足的需求。向项目中创建一个文件,选取Objective-C protocol,并命名为Pet。

//Pet.h
@protocol Pet
@required
- (void)obedient:(NSString *)direction;

@optional
- (void)affectionate;
- (void)play;
- (void)sing;
- (void)dance;
@end

这段代码创建了一个名为Pet的协议。和类的外部接口声明类似,协议定义在@protocol与@end指令之间。@property后接协议名称,并使用@required与@optional指令分别指出哪些方法必须由采用该协议的类实现,哪些方法可以有选择性地实现,默认为@required。对于上述代码,方法obedient:是必须实现的,而方法affectionate、play、sing、dance可以实现,也可以不实现。通过定义协议Pet,要求所有宠物必须听话,但可以撒娇、玩、唱歌和跳舞。

2.实现协议

协议定义之后,需要其他类遵从(实现)协议。在类的外部接口中,可以定义类遵循从哪些协议。例如猫满足宠物的要求(暂时不考虑不听话的野猫和流浪猫),要在程序中反应这个信息,可以修改Cat类的外部接口,让其遵从Pet协议,添加如下代码:

//Cat.h
#import "Pet.h"
@interface Car : NSObject<Pet>

类不允许继承自多个类,但是类允许遵从多个协议,这与C#和Java是一致的。当某个类需要遵从多个协议时,可以在类的接口中的@interface指令后给出,协议名称必须位于尖括号内,多个协议名称之间使用逗号分隔。
Pet规定了一个必须实现的方法。如果Cat类不提供obedient:方法的实现。Xcode代码检查器会提示编译警告(注意不是错误,代码依然能够编译成功),

//Cat.m
- (void)obedient : (NSStirng *)direction {
    NSLog(@"I'm a cute cat.You ask me %@ and I can understand is!", direction);
}

3.使用协议限制对象类型与行为

协议(Protocol)的用法和代码例子 摘

协议(Protocol)的用法和代码例子 时间: 2010-09-17 13:12 协议,是通过网络,计算机使用者进行通讯后,互相进行约定规定的集合。两个类进行通讯,用协议就比较方便。下面是 ...
  • top123xcode
  • top123xcode
  • 2011年04月08日 10:01
  • 2934

OC中协议(Protocol)的小结

协议基础语法 | 用协议实现代理 | 用协议实现不同对象之间的传值 | 用协议实现回调 | 用协议实现多继承 附有详细源代码和注释...
  • Macro_13
  • Macro_13
  • 2014年12月18日 15:07
  • 3540

Protocol 协议总结 - iOS

简单使用1 基本用途 可以用来声明一大堆方法(不能声明成员变量) 只要某个类遵守了这个协议,就相当于拥有了这个协议中的所有方法声明 只要父类遵守了某个协议,就相当于子类也遵守了 2 格式 协议的编写 ...
  • zyq522376829
  • zyq522376829
  • 2016年08月13日 21:10
  • 1904

Protocol Buffer协议规范

Protocol Buffer是Google 的一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式。它可用于通讯协议、数据存储等领域的语言无关、平台无...
  • jnuwuzhun
  • jnuwuzhun
  • 2016年10月10日 16:50
  • 568

Objective-C 【protocol-协议 的了解使用】

——————————————————————————————————————————— protocol(协议) (1)引文:OC中的protocol和Java中的接口(interface)比...
  • Felicity294250051
  • Felicity294250051
  • 2015年09月07日 08:16
  • 1835

iOS 用Protocol 给类加共享的属性

UXYInjectioUXYInjectio can use Protocol to share data that data has been autosaved.How To Use creat ...
  • uxyheaven
  • uxyheaven
  • 2015年02月05日 18:53
  • 6456

swift3新路程(10)协议protocol和扩展extension

声明的关键字就是protocol 我们看一个官方例子 protocol ExampleProtocol { var simpleDescription: String { get } ...
  • anan890624
  • anan890624
  • 2016年09月24日 00:21
  • 1014

iOS中使用协议(protocol)的用法

协议在ios中是和代理一块成双成对的使用的.在后面的UI阶段我们会经常遇见,如,datable...  如何定义一个自己的协议尼.列位上眼呐!    1.协议的表示:@protocol  2.如何创建...
  • whuizhou
  • whuizhou
  • 2015年07月03日 19:41
  • 1829

IOS开发之——Protocol协议的使用

protocol ['prəutəkɔl] (例子:http://blog.sina.com.cn/s/blog_6aafe9c90100yozz.html ) 一、说明  两个类进行通讯,用...
  • zhenyu5211314
  • zhenyu5211314
  • 2014年05月08日 14:11
  • 2450

为什么 ObjC 的 protocol 都要遵从 NSObject 协议?

NSObject
  • u011342466
  • u011342466
  • 2016年10月09日 13:08
  • 294
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:协议(Protocol)
举报原因:
原因补充:

(最多只允许输入30个字)