Objc中的Category
22 Sep 2014objective-c中对一个类的扩展除了使用常见的继承外还提供了一种独特的方法:分类(Category)。
先看一个使用分类扩展类的小例子:
将被扩展的类:
#import <Foundation/Foundation.h>
@interface Fraction : NSObject
{
int numerator;
int denominator;
}
@property int numerator, denominator;
-(void) setTo: (int)n over: (int)d;
-(void) print;
@end
@implementation Fraction
-(void) setTo:(int)n over:(int)d
{
numerator = n;
denominator = d;
}
-(void) print
{
NSLog(@"%d / %d", numerator, denominator);
}
@end
使用obj-c的分类语法扩展Fraction类:
#import <Foundation/Foundation.h>
#import "Fraction.h"
@interface Fraction (MathOps)
-(Fraction*) add: (Fraction*)f;
-(Fraction*) mul: (Fraction*)f;
-(Fraction*) sub: (Fraction*)f;
-(Fraction*) div: (Fraction*)f;
@end
@implementation Fraction (MathOps)
-(Fraction*) add:(Fraction *)f
{
Fraction *result = [[Fraction alloc]init];
int resultNum, resultDenom;
resultNum = (numerator * f->denominator) + (denominator * f->numerator);
resultDenom = denominator * f->denominator;
[result setTo:resultNum over:resultDenom];
return result;
}
@end
分类的特点:
- 只能扩展类的方法,不能扩展变量,否则还得用继承
- 一个类一旦被分类扩展了,也会影响他的所有子类
- 不要使用分类去重写被扩展类的方法,一旦这样做了,你将再也不能访问到原方法了,并不像继承那样可以使用super来访问原方法
- 可以不必实现全部的分类方法,上例中的mul,sub,div没有实现,仅仅是声明一下,可以留待以后去实现