Objective-C中的分类与协议
分类
在谈分类之前,我们可以先探究下,OC中为什么出现分类这种机制,有什么好处?
假设你接到一个大项目:计算两个整数的和,差。接到任务的你马上动手。编写代码如下:
#import <Foundation/Foundation> @interface Calculate :NSObject @property int number1,number2; - (int) sumNumber1:(int)num1 andNumber2: (int)num2;//加法 - (int) subNumber1:(int)num1 andNumber2: (int)num2; //减法 - (void)print; @end
好了,完成工作。
几天后,客户需求发生变化,不仅需要加法,减法功能,还要能做到乘除。我们的做法一般是直接在Calculate类中添加乘,除的方法。当然在这里是没有任何问题的。但是在现实的项目中,代码量十分巨大,以及业务逻辑相当复杂的情况下,直接修改之前源代码是冒有很大的风险的!
现在我们有了另一种做法那就是——分类。
#import <Foundation/Foundation> #import”Calculate”//既然是对原有类的接口的扩展,所以必须包括原始接口 @interface Calculate(MulAndDiv)//告诉编译器这是为Calculate定义的分类名为MulAndDiv - (int) MulNumber1:(int)num1 andNumber2: (int)num2;//乘法 - (int) DivNumber1:(int)num1 andNumber2: (int)num2; //除法 @end
这样我们就做到了在不修改原先代码的情况下,完成了功能的扩展!
但是使用分类要注意以下事项:
1. 分类可以访问原类中的成员变量,但是在分类不能添加任何变量。若需要添加变量可以考虑创建子类
2. 分类中的方法名可以与原类的某个方法名相同(即重载),但是原类的同名方法将失效,不能访问。
3. 可以创建很多的分类
4. 不必实现分类的所有方法。可以在分类中声明所有的方法,但不实现,在需要的时候再去实现。
5. 通过分类添加的方法是可以被子类继承的。
协议
初次接触协议的人,可能很难理解。协议也可以理解为规则或约定。这就像我们都必须遵守的法律,法律中有宪法,刑法,民法。。。。包含很多的方方面面,告诉了我们在不同情况下,应该怎么做。法律是有使用范围的,中国的法律,只要是中国公民就必须遵守,但是美国人就可以不遵守。同样中国人也可以不遵守美国的法律!
OC中的协议即相当与生活中的法律,它定义了很多的方法,但是并没有实现!这需要遵守此协议的类去实现这些方法。这就像你遵守法律去纳税,但法律本身并不纳税。
协议没有父类,并且不能定义成员变量(这里有句台词:还有王法吗?王法?我就是王法!显然法律也不能成为某一个人的,同时法律没有身体,不会吃饭)
协议是多个类共享的一个方法列表,协议中列出方法没有相应的实现,如果一个类采用名为MyProtocol的协议,就必须实现MyProtocol协议内的@required(必须的)标识的方法。协议用@optional标识的方法可选实现!
协议的使用方法:
@interface Person :NSObject <chinaProtocol>
这条语句告诉编译器,Person遵守chinaProtocol协议
如果采用多项协议,只需要他们都列在尖括号中,用逗号分开:
@interface Person :NSObject <chinaProtocol , englishProtocol>
有关协议的总结:
1. 如果一个类遵守某项协议,那么它的子类也遵守该协议
2. 协议是无类的(classless),任何类都可以遵守某项协议
3. 可以在类型名称后添加 <协议名> ,可以让编译器帮助检查变量的一致性
4. 如果变量保存的对象遵守多项协议,可以列出多项协议
5. 定义一项协议时,可以扩展现有协议,即新的协议也遵守旧的协议
@proticol Drawing3D <Drawing>
Drawing3D协议也采用了Drawing协议,因此采用Drawing3D协议的类必须实现Drawing3D列出的方法以及Drawing列出的方法
6. 分类也可以采用一项协议
@interface Person(chinaPerson) <NSCopying,NSCoding>
说明Person类拥有一个分类chinaPerson,这个分类遵守NSCopying 和NSCoding协议
以上纯属本人理解,有不正确之处,欢迎指正!
Objective-C中的分类与协议的更多相关文章
- oc中的分类/协议/属性
1.分类:当我们想给某个类加一些方法时,如果不想通过继承这个类来实现,可以通过分类给这个类加一些行为,这个过程与继承相比更加轻量化. @interface NSString (SubClass) -( ...
- 如何在swift中实现oc中的分类
在oc中为了增强已有类的功能,我们经常使用分类.使用分类,我们可以在不破坏原有类的结构的前提下,对原有类进行模块化的扩展. 但是在swift中没有分类这种写法了.相对应的是swift中只有扩展(Ext ...
- Swift基础--Swift中的分类以及在分类中扩展init方法的注意事项
Swift中的分类 1.创建一个空的swift文件 2.关键字extension,格式: extension 要扩展的类名 {} extension UIButton { } Swift中扩展init ...
- IOS中把字符串加密/IOS中怎么样MD5加密/IOS中NSString分类的实现
看完过后,你会学到: 1学习IOS开发中的分类实现, 2以及类方法的书写, 3以及字符串的MD5加密/解密. ---------------------------wolfhous---------- ...
- RTSP RTSP(Real Time Streaming Protocol),RFC2326,实时流传输协议,是TCP/IP协议体系中的一个应用层协议
RTSP 编辑 RTSP(Real Time Streaming Protocol),RFC2326,实时流传输协议,是TCP/IP协议体系中的一个应用层协议,由哥伦比亚大学.网景和RealNetwo ...
- 理解Objective C 中id
什么是id,与void *的区别 id在Objective C中是一个类型,一个complier所认可的Objective C类型,跟void *是不一样的,比如一个 id userName, 和vo ...
- 浅谈Objective—C中的面向对象特性
Objective-C世界中的面向对象程序设计 面向对象称程序设计可能是现在最常用的程序设计模式.如何开发实际的程序是存在两个派系的-- 面向对象语言--在过去的几十年中,很多的面向对象语言被发明出来 ...
- HTTPS 中双向认证SSL 协议的具体过程
HTTPS 中双向认证SSL 协议的具体过程: 这里总结为详细的步骤: ① 浏览器发送一个连接请求给安全服务器.② 服务器将自己的证书,以及同证书相关的信息发送给客户浏览器.③ 客户浏览器检查服务器送 ...
- sql连接查询中的分类
sql连接查询中的分类 1.内连接(结果不保留表中未对应的数据) 1.1等值连接:关联条件的运算符是用等号来连接的. 1.2不等值连接:连接条件是出等号之外的操作符 1.3自然连接:特殊的等值连接,在 ...
随机推荐
- poj3709
首先我们发现将一段数变为同一个数比间隔着搞肯定优,因为数列是升序的,然后不难得到方程式f[i]=min(f[j]+sum[i]-sum[j]-(i-j)*a[j+1]) (i-j>=m)简单的斜 ...
- Delphi 用Web App Debugger简单调试ISAPI 转
用Web App Debugger简单调试ISAPI 以isapi为例: 1.新建一个project,用isapi/nsapi: 2.remove这个project中所有的unit: 3.加进你用 ...
- Matrix的set,pre,post调用顺序
Matrix调用一系列set,pre,post方法时,可视为将这些方法插入到一个队列.当然,按照队列中从头至尾的顺序调用执行.其中pre表示在队头插入一个方法,post表示在队尾插入一个方法.而set ...
- Delphi十进制和十六进制互转
Delphi 自带函数 IntToHex 功能说明:该函数用于将“十进制”转换成“十六进制”.该函数有二个参数.第一个参数为要转换的十进制数据,第二个参数是指定使用多少位来显示十六进制数据. 参考实例 ...
- /var/log目录下的20个Linux日志文件功能详解 分类: 服务器搭建 linux内核 Raspberry Pi 2015-03-27 19:15 80人阅读 评论(0) 收藏
如果愿意在Linux环境方面花费些时间,首先就应该知道日志文件的所在位置以及它们包含的内容.在系统运行正常的情况下学习了解这些不同的日志文件有助于你在遇到紧急情况时从容找出问题并加以解决. 以下介绍的 ...
- export 命令 设置环境变量
export KERN_DIR=/usr/src/kernels/2.6.18-194.11.1.el5-x86_64 设置环境变量 内核加载目录
- Compiling JSPs Using the Command-Line Compiler---官方
Web Server provides the following ways of compiling JSP 2.1-compliant source files into servlets: JS ...
- objective-c 中的关联介绍
objective-c 中的关联介绍 转载请注明CSDN博客上的出处: http://blog.csdn.net/daiyibo123/article/details/46471993 如何设置关联 ...
- Android 6.0 Changes
原文链接:http://developer.android.com/about/versions/marshmallow/android-6.0-changes.html 伴随着新特性和功能,Andr ...
- Android Studio学习随笔-UI线程阻塞以及优化
我们在使用手机的时候,经常会遇到一个问题:先是卡死,然后跳出该程序无响应,是否关闭的提示(当然有可能是我们手机性能太差=.=)这是因为线程的阻塞引起的,在这里我讲述一下UI线程,一般处理程序会在UI线 ...