码迷,mamicode.com
首页 > 其他好文 > 详细

[黑马程序员]Objective-C 面向对象之分类

时间:2015-04-13 12:49:06      阅读:119      评论:0      收藏:0      [点我收藏+]

标签:

什么是分类

分类可以使得不修改原来类的代码的基础上,对某个类进行方法的扩充。

来看一个简单的例子:

我们现有一个类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.hCalculator.m之中,现在的需求是,我们希望对这个计算器类进行扩充,使之能够进行乘法和除法运算,但因为分工问题,将乘法和除法分别给TomJerry进行开发,但如果TomJerry同时修改Calculator.hCalculator.m会造成各种各样的冲突(实际开发中可能会使用SVN或者GIT来自动处理这些问题,但此处假设的需求远比实际需求简单得多),因此,我们希望TomJerry各自新建不同的文件来进行开发,就需要使用到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.hCalculator+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;
}

使用注意:

  • 分类只能扩充方法,不能增加成员变量的定义
  • 类和分类中的如果有相同名称的方法,会覆盖掉原来类的同名方法,导致原类的方法不可用
  • 调用的顺序是:分类的方法优先级是最高的,然后才是原来类的方法的优先级次之
  • 如果一个类有多个分类的时候,编译的时候的顺序,就是方法调用的优先级

 

[黑马程序员]Objective-C 面向对象之分类

标签:

原文地址:http://www.cnblogs.com/imabel/p/4421695.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!