分类
定义:通过分类(category)可以以模块的形式向类添加方法,以及创建标准化的方法列表提供给他人实现。
需求:有时候面对一个类定义,可能想要添加一些新的方法。
(1)如对于Fraction类,想要添加除了add之外的乘除等方法;
(2)假如你已经知道如何使用Foundation框架的数组类,名为:NSArray,并意识到希望这个类可以实现另一个或多个方法。当然,可以使用类的继承;但是这里有更简单的方式,就是通过分类。
1.Code实例:
Fraction.h
#import <Foundation/Foundation.h>
@interface Fraction: NSObject
@property int numerator,denominator;
-(void) print;
@end
@interface Fraction(OpMath)
-(Fraction *)add : (Fraction *)f;
@end
Fraction.m
#import "Fraction.h"
@implementation Fraction
@synthesize numerator,denominator;
-(void) print{
NSLog(@"%i %i",numerator,denominator);
}
@end
@implementation Fraction(OpMath)
-(Fraction *) add: (Fraction *) f{
//两个分数相加!
Fraction *result = [[Fraction alloc] init];
result.numerator = (numerator*f.denominator)+(denominator*f.numerator);
result.denominator = denominator*f.denominator;
return result; //返回值
}
@end
main.m
#import "Fraction.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Fraction *f1 = [[Fraction alloc] init];
Fraction *f2 = [[Fraction alloc] init];
Fraction *result;
f1.numerator = 2;f1.denominator = 5;
f2.numerator = 1;f2.denominator = 5;
result = [f1 add:f2 ];
[result print];
}
return 0;
}
2.关于分类的注意事项:
(1)分类可以覆写该类中的另一个方法,但通常不这么做,认为不好;(因为在Object-c的分组设计中,覆写一个方法后,以前的方法不能再访问;但是如果是子类的继承覆盖,仍然和java一样,可以通过使用super来进行调用。)
(2)如果对一个根类定义了新方法(分类),那么会影响到其所有的子类,每个子类都会继承这些新方法,这样就会存在潜在的危险。
(3)分类的命名规则:一般可以使用类名+分类名的方式。
(4)分类可以访问原始类定义的变量,但是不能再定义属性,如果需要再定义,则需要声明子类来实现。
(5)一个类可以有多个分类。
(6)和接口的不同:
不必实现分类的所有方法,这个对程序的拓展很有用,因为可以再该分类的声明中声明所有的方法,然后在一段时间之后再来实现它。
总结:
总结摘自:http://blog.csdn.net/braddoris/article/details/24620199