Objective-C中的分类与协议

                                                                                         分类                                                                                                 less

在谈分类以前,咱们能够先探究下,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. 经过分类添加的方法是能够被子类继承的。

                                                                                             协议                                                                                             ui

初次接触协议的人,可能很难理解。协议也能够理解为规则或约定。这就像咱们都必须遵照的法律,法律中有宪法,刑法,民法。。。。包含不少的方方面面,告诉了咱们在不一样状况下,应该怎么作。法律是有使用范围的,中国的法律,只要是中国公民就必须遵照,可是美国人就能够不遵照。一样中国人也能够不遵照美国的法律!

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协议

 

以上纯属本人理解,有不正确之处,欢迎指正!spa

相关文章
相关标签/搜索