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
Objective-C 协议(protocol)二的更多相关文章
- OC基础--分类(category) 和 协议(protocol)
OC 中的category分类文件相当于 C#中的部分类:OC 中的protocol协议文件(本质是头文件)相当于 C#中的接口.今天就简单说明一下OC中的这两个文件. 由于视频中的Xcode版本低, ...
- Objective-C:继承、分类(Category、extension)、协议(protocol),个人理解,仅供参考
总结:继承.分类(Category.extension).协议(protocol) 一.继承: (1)特点: 继承多用于一般父类中的方法功能比较齐全,子类从父类继承过来使用,可以省略很多重复的代码 ...
- 协议(Protocol)与委托代理(Delegate)
协议(Protocol)的作用: 1. 规范接口,用来定义一套公用的接口: 2. 约束或筛选对象. 代理(Delegate): 它本身是一种设计模式,委托一个对象<遵守协议>去做某件事情, ...
- iOS阶段学习第19天笔记(协议-Protocol)
iOS学习(OC语言)知识点整理 一.关于协议(Protocol)的介绍 1)概念:协议指多个对象之间协商的一个接口对象,协议提供了一些方法用在协议的实现者和代理者 之间通讯的一种方式 2) ...
- 协议Protocol
1.协议:是一组声明方法的集合,不能声明成员变量,作用类似于接口. 遵守此协议的类就相当于拥有了这个协议的所有方法的声明,如果父类遵守了某个协议,子类也遵守了这个协议. ...
- 浅谈iOS开发的协议(protocol)和代理(delegate)
协议和代理对于一个新手来说确实不讨好理解,也有很多的iOS开发的老手对此是懂非懂的.网上的很多博文只是讲了怎么使用,并没有说的很明白.下面我谈一下我的理解. 1.你要先搞明白,协议和代理为什么会出现, ...
- 关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol
关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol 2014-02-18 19:57 315人阅读 评论(0) 收藏 举报 1.category, ...
- Objective-C中的协议(Protocol)和类别(Category)
1.什么是协议? 2.协议与类别的声明和使用 1.什么是协议? 在Objective-C中,不支持多继承,即不允许一个类有多个父类,但是OC提供了类似的实现方法,也就是协议.协议有点类似于Java里的 ...
- HTTP协议(二)
一.请求的格式: (一).请求行 (1).请求方法 1.GET 2.POST 3.PUT 4.DELETE 5.TRACE 6.OPTIONS (2).请求路径 (3).所用的协议 (二).请求头信息 ...
- 网络通信 --> 互联网协议(二)
互联网协议(二) 一.对上一节的总结 我们已经知道,网络通信就是交换数据包.电脑A向电脑B发送一个数据包,后者收到了,回复一个数据包,从而实现两台电脑之间的通信.数据包的结构,基本上是下面这样: 发送 ...
随机推荐
- 打印机增强软件pdfpro
http://3dx.pc6.com/gm1/pdfpro.zip
- Linux学习-软件管理员简介
Linux 界的两大主流: RPM 与 DPKG 目前在 Linux 界软件安装方式最常见的有两种,分别是: dpkg: 这个机制最早是由 Debian Linux 社群所开发出来的,透过 dpkg ...
- 电商平台API接口
- Python学习-day6 面向对象概念
开始学习面向对象,可以说之前的学习和编程思路都是面向过程的,从上到下,一步一步走完. 如果说一个简单的需求,用面向过程实现起来相对容易,但是如果在日常生产,面向对象就可以发挥出他的优势了. 程序的可扩 ...
- Mongodb 删除记录里的某个字段
//例如要把User表中address字段删除 db.User.update({},{$unset:{'address':''}},false, true)
- JAVA-json数据与Java的bean类的互相转换
Java调用webservice时用到了json格式的数据,然后就整理这个类.那里不合适的话,希望能够得到指正. public class JsonsAndBeanList { /** * json数 ...
- [python学习篇][书籍学习][python standrad library][内建类型]之数值
数值类型 — int, float, long, complex 有四种不同的数值类型:普通整数.长整数.浮点数和复数 普通整数(或者简称整数)使用C中的long实现,其精度至少为32位(sys.ma ...
- Linux Shell系列教程之(七)Shell输出
本文是Linux Shell系列教程的第(七)篇,更多shell教程请看:Linux Shell系列教程 与其他语言一样,Shell中也有输出操作,而且在实际应用中也是非常重要的,今天就为大家介绍下S ...
- 《如何成为一位大家愿意追随的Leader》读后感
今天看了左耳朵耗子老师的文章<如何成为一位大家愿意追随的Leader>深有感触.每一行字都往心里说,文章里说到Leader和Boss的不同点在于,Leader是大家跟我一起上,而Boss则 ...
- linux监控平台搭建-内存
linux监控平台搭建-内存 上一篇文章说的硬盘.就写一下.更加重要的东西.在手机上面是RAM.机器是memory.内存是按照字节编址.每个地址的存储单元可以存放8bit的数据.cpu 通过内存地址获 ...