Objective-C 协议(protocol)二
我们前面提到了OOP的继承,我们说Objective-C不像C++可以有多重继承,Objective-C是单一继承的,如果想要做到一个类别同时拥有多种型别的能力,我们就可以通过协议来实现。Objective-C中的协议就是java中的接口(interface),在Java中用”interface”这个关键字,在Objective-C则是用”@protocol”。(要特别注意不要把interface跟protocol搞混了,在Objective-C的interface等于java的class,而protocol则是相当于java中的interface).
定义Protocol很简单,在声明文件(h文件)中通过关键字@protocol定义,然后给出Protocol的名称,方法列表,然后用@end表示Protocol结束。在@end指令结束之前定义的方法,都属于这个Protocol。
除非你是为特定的类编写协议,可以写在相关类的h文件中,否则可以单独放在一个h文件中.这里还有两个关键字,@required和@optional,表 示如果要实现这个协议,那么添加@required注解的方法是必须要实现的,添加@optional注解的方法则是可选的,这两个注解关键字是在 Objective-C 2.0之后加入的语法特性。如果不注明,那么方法默认是@required的,必须实现。
Protocol本身是可以继承的,例如:
1
2
3
4
5
6
7
8
9
10
11
|
@protocolProtocolA
-(void)methodA;
@end
@protocolProtocolB<ProtocolA>
-(void)methodB;
@end
|
如果你要实现ProtocolB,那么methodA和methodB都需要实现。
与java相比,接口使用的关键字不一样,语法也不一样.在承诺实现、或采用某个协议的接口代码中,协议的名称要写在父类名称后边的一对尖括号里(<…>),实现多个协议则用逗号(,)分隔:
分类也可以实现协议,说法如下:
协议不引用任何类,它是类无关的(classless),任何类都可以实现定义好的Protocol。如果我们想知道某个类是否实现了某个Protocol,可以使用conformsToProtocol进行判断,如下:比如在使用optional类型的protocal时就需要使用这种方法来判断的确有执行这个方法
1
|
if([obj conformsToProtocol:@protocol(ProtocolName)]==YES){}
|
这里使用@protocol指令用于获取一个协议名称,并产生一个Protocol对象,并作为conformsToProtocol:的参数.为了测试obj是否实现了协议中的某一个方法,可以编写以下代码:
1
2
3
|
if([obj respondsToSelector:@selector(methodName)]){
[obj methodName];
}
|
了解更多信息可以查看iOS Developer Library中关于Protocol的介绍:Working with Protocols
最新文章
- springmvc SSM shiro redis 后台框架 多数据源 代码生成器
- init shutdown reboot poweroff halt区别
- Seo标签权重
- android 处理302地址
- 初试 Matlab 之去除水印
- test Windows Live Writer
- c# 调用 CRFs应用程序
- toB的产品经理和toc产品经理区别
- PROCESS_YIELD()宏使用及过程分析<;contiki学习笔记之八>;
- Django视图与网址传参
- sql - union all
- 高德JAVA笔试题
- FreeMarker 小结
- css实现选项卡
- 关于SQLALCHEMY之(一)
- ArcGIS 网络分析[8.6] 资料6 创建网络分析图层及进行路径分析
- Windchill基本业务对象-文档
- Ubuntu 15.10 下Scala 操作Redis Cluster
- 通过java实现解压zip,rar的代码
- SpringMVC 允许跨域访问 也可以选择限制指定IP 允许访问 对象的数据传输
热门文章
- poj--1064
- MVC如何在解决方案下创建文件夹
- Windows下新建多级文件夹
- Zend Framework 2中如何使用Service Manager
- Selenium WebDriver- 操作JavaScript的confirm弹窗
- spark作业
- JavaScript 专题系列第六篇,讲解深浅拷贝的技巧和以及实现深浅拷贝的思路
- [错误处理]UnicodeDecodeError: &#39;ascii&#39; codec can&#39;t decode byte 0xe5 in position 0: ordinal not in range(128)
- sqlserver的left join优化
- C#发送邮件异常,返回信息乱码