什么是分类
分类可以使得不修改原来类的代码的基础上,对某个类进行方法的扩充。
来看一个简单的例子:
我们现有一个类Calculator我们为其实现了加法和减法方法:
#import "Foundation/Foundation.h" @interface Calculator : NSObject // Plus -(int) plus: (int)num1 and:(int)num2; // Less -(int) less: (int)num1 and:(int)num2; @end @implementation Calculator -(int) plus:(int)num1 and:(int)num2{ return num1 + num2; } -(int) less:(int)num1 and:(int)num2{ return num1 - num2; } @end
我们将上面Calculator的实现和声明分别置于Calculator.h和Calculator.m之中,现在的需求是,我们希望对这个计算器类进行扩充,使之能够进行乘法和除法运算,但因为分工问题,将乘法和除法分别给Tom和Jerry进行开发,但如果Tom和Jerry同时修改Calculator.h和Calculator.m会造成各种各样的冲突(实际开发中可能会使用SVN或者GIT来自动处理这些问题,但此处假设的需求远比实际需求简单得多),因此,我们希望Tom和Jerry各自新建不同的文件来进行开发,就需要使用到OC的分类。
Tom:
#import <Calculator.h> @interface Calculator(Tom) -(int)multiplied:(int)num1 and:(int)num2; @end @implementation Calculator(Tom) -(int)multiplied:(int)num1 and:(int)num2{ return num1 * num2; } @end
注:为了节省篇幅,将声明和实现写在一起,在下文我们仍然认为上面代码放置于Calculator+Tom.h和Calculator+Tom.m中,下同。
Jerry:
#import <Calculator.h> @interface Calculator(Jerry) -(double)except:(int)num1 and:(int)num2; @end @implementation Calculator(Jerry) -(double)except:(int)num1 and:(int)num2{ return num1 / num2; } @end
当我们需要使用时,分别引入Calculator.h、Calculator+Tom.h、Calculator+Jerry.h:
#import "Calculator.h" #import "Calculator+Tom.h" #import "Calculator+Jerry.h" int main(){ Calculator *calculator = [Calculator new]; [calculator plus:3 and: 4]; // output: 7 [calculator less:3 and: 4]; // output: -1 [calculator multiplied:3 and: 4]; // output: 12 [calculator except:3 and: 4]; // output: 0.75 return 0; }
使用注意:
- 分类只能扩充方法,不能增加成员变量的定义
- 类和分类中的如果有相同名称的方法,会覆盖掉原来类的同名方法,导致原类的方法不可用
- 调用的顺序是:分类的方法优先级是最高的,然后才是原来类的方法的优先级次之
- 如果一个类有多个分类的时候,编译的时候的顺序,就是方法调用的优先级
时间: 2024-10-13 00:18:23