在.NET中有接口的概念,接口主要用于定义规范,定义一个接口关键字使用interface。而在Object C 中@interface是用于定义一个类的,这个和.NET中有点差别。在Object C中有一个协议(protocol) 的概念,这个和 .NET 中的 interface 类似。

协议(Protocol) 在列出的方法在本类中并没有相应实现,而是别的类来实现这些方法,而定义协议必须使用protocol关键字。

一. 如何定义protocol的定义

如何使用XCode新建一个协议.h 文件

定义协议代码如下:

#import <Foundation/Foundation.h>
@protocol ProtocolCom <NSObject>
@required
-(void) eat;
@optional
-(void) write;
@end

 从以上代码可以看到,我们可以了解到定义一个协议基本如下结构: 

@protocol protocolName<NSObject>
@required
//方法声明
@optional
//方法声明
.......
@end

从刚才的代码中,定义了一个名为ProtocolCom的协议,其中有两个方法 eat ,write;  上面也提到过了,protocol相当于.net中的interface 接口,接口就是用于定义规则的,但是Object C中的协议和.NET中的interface还是有点区别的,这里就涉及到@required,@optional 。 这两个标注在方法上面是有特殊含义的,这个后面详细说明。

#import <Foundation/Foundation.h>
@protocol ProtocolCom
@required
-(void) eat;
@optional
-(void) write;
@end

从上面修改的代码对比来看,在协议定义后面缺少了<NSObject> ,这段代码仍然能够正常运行,其实<NSObject>也本身可以理解为ProtocolCom要遵循NSObject 协议,这个和.NET中一个类如果没有显示指定继承哪个类,那么默认就是继承的Object类的道理是一样的,所以这里可以省略。

这里我在定义一个协议MyProtocol,这个协议必须遵循协议ProtocolCom协议。刚才上面已经了解到了协议后面跟<NSObject>,道理一样如果MyProtocol要遵循协议ProtocolCom就是用此种方式来实现,具体代码如下:

#import <Foundation/Foundation.h>
#import "ProtocolCom.h"
@protocol MyProtocol <ProtocolCom>
@required
-(void) setname;
@optional
-(void) setage;
@end

在Object C 协议中并不习惯说继承,而是是用遵从或者遵循,比如A协议遵循B协议。这里专业上得术语可能不太准确,姑且这么说,先理解意思。

然后我们是用一个新的类来实现协议 MyProtocol 中的所有方法。

#import <Foundation/Foundation.h>
#import "MyProtocol.h"
@interface Student : NSObject<MyProtocol>
@end-------------------------------------------#import "Student.h"
@implementation Student
-(void) write{NSLog(@"write");
}-(void) eat{NSLog(@"eat");
}-(void) setage{NSLog(@"Student---setage");
}-(void) setname{NSLog(@"Student----setname");
}@end

从以上代码可以看出类Student实现了协议MyProtocol,因为协议MyProtocol遵循协议ProtocolCom,所以协议MyProtocol有四个方法。所以在Student类中可以实现四个方法。

二. 协议相关约束

 @required 用于表示协议中该方法必须在类中实现,默认[如果不加则默认为@required]

 @optional 用于表示协议中该方法在类中可以选择实现

 看到这里貌似比.NET中的要高级点,.NET中interface定义的所有方法在子类中都必须实现。如果用@required标识的方法在子类中没有实现那么编译编译会报错,提示该方法必须实现。而@optional则不会。下面这段代码就会存在问题:

#import "Student.h"
@implementation Student
-(void) write{NSLog(@"write");
}
-(void) eat{NSLog(@"eat");
}
-(void) setage{NSLog(@"Student---setage");
}
@end

三. 同时遵循多个协议

 在.NET中一个类也可以实现多个接口,在Object C中同样如此,一个类可以实现遵循多个接口,基本语法如下:

 @interface className:parentName<ProtocolName1,ProtocolName2,...>......@end

虽然上面简单了点,但是还是能够看明白表达的意思,下面看一段代码说明:

这里从新定义一个新的协议NewProtocol,里面有一个必须实现的方法getname

#import <Foundation/Foundation.h>
@protocol NewProtocol <NSObject>
@required
-(NSString*) getname;
@end

然后从新定义一个新的类Children,这个类必须遵循协议NewProtocol和协议MyProtocol ,具体代码如下:

#import <Foundation/Foundation.h>
#import "MyProtocol.h"
#import "NewProtocol.h"@interface Children : NSObject<MyProtocol,NewProtocol>
@end

在Children.m代码中要实现两个协议中必须实现的方法

#import "Children.h"
@implementation Children-(void) eat{NSLog(@"eat");
}-(void) setname{NSLog(@"Student--setname");
}-(NSString*) getname{return  @"qingyuan";
}
@end

下面使用测试代码,看看一个类遵循两个协议的效果:

Children *child=[[Children alloc] init];
NSString *name=[child getname];
NSLog(@"name=%@",name);
[child eat];
[child setname];    

在上面的代码中可以正常运行,但是要注意如果可选择实现的方法没有去实现,而在这里去调用的话会报错。

四. 正式协议和非正式协议

说道正式协议和非正式协议,其实只要理解两个关键字@interface 和 @protocol 。先看看下面一个列子

#import <Foundation/Foundation.h>
#import "MyProtocol.h"
#import "NewProtocol.h"@interface Children : NSObject<MyProtocol,NewProtocol>
-(void) love;
@end

在Children.h中定义了一个新的方法love,之前我们也一直这样写的,没有任何问题。再看下面一段代码

#import "Children.h"
@implementation Children-(void) eat{NSLog(@"eat");
}-(void) setname{NSLog(@"Student--setname");
}-(NSString*) getname{return  @"qingyuan";
}
@end

使用编译器编辑,代码并没有报错。在Children.m中没有love方法的实现。 这个和我们之前所见到的代码似乎有点不一样啊,有点不理解,理论上Children.m中应该实现love方法的。

上面看到的这种情况,就好比Protocol中的@optional方法,是可以选择实现的,其实我们就称作@interface Children : NSObject 就是一个非正式协议。

刚才也注意到了,那是不是Protocol中的@optional标识的方法也就是非正式协议呢。在这里网络上有些争议,个人也没有完全明白,但是个人理解这个还是不一样的。@protocol是一种既定的规则,如果要做就必须遵循这种规则,而@interface有点象描述,用于描述类是干什么的. 而两者因为都可选择实现其他的方法,所以感觉有点类似。

五. 协议总结

 Object C 中有点特殊的时协议不引用任何类,任何类都可以实现已经定于好的协议。

bool flag1=[child conformsToProtocol:@protocol(NewProtocol)];
NSLog(@"%d",flag1);bool flag2=[child conformsToProtocol:@protocol(MyProtocol)];
NSLog(@"%d",flag2);bool flag3=[child conformsToProtocol:@protocol(ProtocolCom)];
NSLog(@"%d",flag3);

从以上代码可以看得出, conformsToProtocol 方法用于判断某个类是否遵循某个协议,返回值为bool类型,即使协议是通过"继承"过来的也可以。

转载于:https://www.cnblogs.com/jiuyi/p/10079485.html

Object C学习笔记15-协议(protocol)相关推荐

  1. Object C学习笔记22-#define 用法

    上一篇讲到了typedef 关键字的使用,可以参考文章 Object C 学习笔记--typedef用法 .而在c中还有另外一个很重要的关键字#define. 一. #define 简介 在C中利用预 ...

  2. Object C学习笔记12-集合

    Object C学习笔记12-集合 2014-03-08 17:25 by 贺臣, 262 阅读, 0 评论, 收藏, 编辑 这里讲到的集合是指Set集合,其实Array也是一种类型的集合.在Obje ...

  3. Hadoop学习笔记—15.HBase框架学习(基础知识篇)

    Hadoop学习笔记-15.HBase框架学习(基础知识篇) HBase是Apache Hadoop的数据库,能够对大型数据提供随机.实时的读写访问.HBase的目标是存储并处理大型的数据.HBase ...

  4. 【转】医疗业务学习笔记--DICOM协议的基础内容!!!!!!!!!!

    转自:医疗业务学习笔记--DICOM协议的基础内容 - 知乎 本文首发于"雨夜随笔"公众号,欢迎关注. DICOM协议是医疗领域对如何处理.存储.打印和传输医疗图片的一系列标准.D ...

  5. C++语言学习笔记15:Clean 垃圾清理插件

    C++语言学习笔记15:Clean 垃圾清理插件 对话框 STET1 图片切换功能 导入位图资源 插入图片控件并修改属性 添加消息处理函数 step2 开发思路及类关系图 step3 添加控件及MFC ...

  6. 区块链学习笔记15——ETH状态树

    区块链学习笔记15--ETH状态树 学习视频:北京大学肖臻老师<区块链技术与应用> 笔记参考:北京大学肖臻老师<区块链技术与应用>公开课系列笔记--目录导航页 引入 要实现的功 ...

  7. 数据结构与算法学习笔记15:最大流问题 / 二分图 / 有权无权二分图的匹配 / 匈牙利算法 / 银行家算法 / 稳定婚配

    数据结构与算法学习笔记15:最大流问题 / 二分图 / 有权无权二分图的匹配 / 匈牙利算法 / 银行家算法 / 稳定婚配 引入小题:最短路径 最大流问题(maximum flow problem) ...

  8. 点云学习笔记15——PCL常用的基础代码

    点云学习笔记15--PCL基础 命名规范 常用代码 1.时间计算 2.pcl::PointCloud::Ptr和pcl::PointCloud的两个类相互转换 3.如何查找点云的x,y,z的极值? 4 ...

  9. 凸优化学习笔记 15:梯度方法

    前面的章节基本上讲完了凸优化相关的理论部分,在对偶原理以及 KKT 条件那里我们已经体会到了理论之美!接下来我们就要进入求解算法的部分,这也是需要浓墨重彩的一部分,毕竟我们学习凸优化就是为了解决实际当 ...

最新文章

  1. R语言可视化分面图、假设检验分组t检验、可视化单变量分组分面箱图(faceting boxplot)并添加p值(Make facet boxplot and add p-values)、添加抖动数据点
  2. pandas 笔记:合并操作
  3. 说说 JAVA 代理模式
  4. script标签中的async和defer
  5. 做系统ghost步骤图解_用好这工具,小孩都能会重装系统!
  6. 计算机组装技术的心得与体会,计算机技术心得体会
  7. 《Python绝技:运用Python成为顶级黑客》 用Python进行取证调查
  8. php使用jasperreport,用PHP访问JasperReport | 学步园
  9. python安装nodejs_linux上nodejs安装
  10. 了解 Nginx 主要应用场景
  11. 编码器及编码器在SMART200中的使用
  12. dreamweaver网页设计作业制作 学生个人网页单页 WEB静态网页作业模板 大学生个人主页博客网页代码 dw个人网页作业成品
  13. Python游戏开发实战:飞机大战(含代码)
  14. greenplum数据迁移gpcopy
  15. 给你介绍Python代码中下划线的魔幻魅力!
  16. 【图文详解】RE文件管理器手工精简Android系统
  17. 支付宝InfoStr怎么获取
  18. 1.thrift概述
  19. 16.04Ubuntu桌面版搭建
  20. wps文字 用WPS如何演示制作英语有声读物

热门文章

  1. append是什么意思java_关于append()问题
  2. python判断手机号码是否正确_Python实现随机生成手机号及正则验证手机号的方法...
  3. BUUCTF Web [极客大挑战 2019]EasySQL
  4. Python随机梯度下降法(二)
  5. java中extends怎么用_Java 中extends與implements使用方法
  6. WINDOWS下DOCKER安装后卡在boot2docker.iso无法启动
  7. SQL模糊查询特殊符号应用及详细案例说明
  8. 【跃迁之路】【716天】程序员高效学习方法论探索系列(实验阶段473-2019.2.6)...
  9. Ubuntu 16.04中iptables的工具简介(iptables/iptables-restore/iptables-xml/iptables-apply/iptables-save)...
  10. android开发——手机通话功能实现