分类

在谈分类之前,我们可以先探究下,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中的分类与协议的更多相关文章

  1. oc中的分类/协议/属性

    1.分类:当我们想给某个类加一些方法时,如果不想通过继承这个类来实现,可以通过分类给这个类加一些行为,这个过程与继承相比更加轻量化. @interface NSString (SubClass) -( ...

  2. 如何在swift中实现oc中的分类

    在oc中为了增强已有类的功能,我们经常使用分类.使用分类,我们可以在不破坏原有类的结构的前提下,对原有类进行模块化的扩展. 但是在swift中没有分类这种写法了.相对应的是swift中只有扩展(Ext ...

  3. Swift基础--Swift中的分类以及在分类中扩展init方法的注意事项

    Swift中的分类 1.创建一个空的swift文件 2.关键字extension,格式: extension 要扩展的类名 {} extension UIButton { } Swift中扩展init ...

  4. IOS中把字符串加密/IOS中怎么样MD5加密/IOS中NSString分类的实现

    看完过后,你会学到: 1学习IOS开发中的分类实现, 2以及类方法的书写, 3以及字符串的MD5加密/解密. ---------------------------wolfhous---------- ...

  5. RTSP RTSP(Real Time Streaming Protocol),RFC2326,实时流传输协议,是TCP/IP协议体系中的一个应用层协议

    RTSP 编辑 RTSP(Real Time Streaming Protocol),RFC2326,实时流传输协议,是TCP/IP协议体系中的一个应用层协议,由哥伦比亚大学.网景和RealNetwo ...

  6. 理解Objective C 中id

    什么是id,与void *的区别 id在Objective C中是一个类型,一个complier所认可的Objective C类型,跟void *是不一样的,比如一个 id userName, 和vo ...

  7. 浅谈Objective—C中的面向对象特性

    Objective-C世界中的面向对象程序设计 面向对象称程序设计可能是现在最常用的程序设计模式.如何开发实际的程序是存在两个派系的-- 面向对象语言--在过去的几十年中,很多的面向对象语言被发明出来 ...

  8. HTTPS 中双向认证SSL 协议的具体过程

    HTTPS 中双向认证SSL 协议的具体过程: 这里总结为详细的步骤: ① 浏览器发送一个连接请求给安全服务器.② 服务器将自己的证书,以及同证书相关的信息发送给客户浏览器.③ 客户浏览器检查服务器送 ...

  9. sql连接查询中的分类

    sql连接查询中的分类 1.内连接(结果不保留表中未对应的数据) 1.1等值连接:关联条件的运算符是用等号来连接的. 1.2不等值连接:连接条件是出等号之外的操作符 1.3自然连接:特殊的等值连接,在 ...

随机推荐

  1. Android与服务器端数据交互(http协议整合struts2+android)

    在android中有时候我们不需要用到本机的SQLite数据库提供数据,更多的时候是从网络上获取数据,那么Android怎么从服务器端获取数据呢?有很多种,归纳起来有 一:基于Http协议获取数据方法 ...

  2. 【转】Android:Bluetooth 的打开和关闭--不错

    原文网址:http://www.ifeegoo.com/android-turn-on-and-turn-off-bluetooth.html 摘要:Android 中打开和关闭 Bluetooth ...

  3. 关于java、Android中Math的一些用法

    java.math.Math类常用的常量和方法: Math.PI 记录的圆周率Math.E记录e的常量Math.abs 求绝对值Math.sin 正弦函数 Math.asin 反正弦函数Math.co ...

  4. IE的表头固定/表头不动(使用expression)

    本文主要介绍在IE浏览器中,实现表头固定的一种方法.这种方法使用到了 IE 浏览器特有的 expression 方法. 表头固定DEMO1 主要代码: <style type="tex ...

  5. 【转】VS 代码行数统计

    [转自]http://www.cnblogs.com/JuneZhang/archive/2013/01/10/2854572.html VS用正则表达式统计代码行数 利用VS2010的查找功能和正则 ...

  6. Shadow Register 是什么?

    ARM处理器有个Shadow Register的概念,查了很多资料,语焉不详,究竟是什么意思呢? 这其实是个和硬件有关的概念. 有些register是2层的,第一层是供CPU访问,第二层供Hw访问. ...

  7. reloadData should be in main thread

    reloadData should be called in main thread, so if you call it in work thread, you should call it as ...

  8. stickyListHeaders框架的使用

    最近在Demo中使用到了stickyListHeaders框架实现悬停效果 比较好用 在xml中 <se.emilsjolander.stickylistheaders.StickyListHe ...

  9. 转 MySQL 用户权限详细汇总

    http://blog.csdn.net/mchdba/article/details/45934981 1,MySQL权限体系 MySQL 的权限体系大致分为5个层级: 全局层级: 全局权限适用于一 ...

  10. 初学scala1——Option

    Scala的Option[T]是容器对于给定的类型的零个或一个元件.Option[T]可完美替代Java中的null,可以是Some[T]或者None. 例如,Scala Map的get方法输出即为O ...