object-c学习:类别Category

来源:互联网 发布:mac air演讲者模式 编辑:程序博客网 时间:2024/05/17 22:37

一直不明白类别的意思,因为C和java都没有类似的概念。

看到如下的描述,比较清晰,供大家参考:

 

 如果你想扩充一个类的功能,但又不想使用继承,你可以选择类别。
下面我们写一个Fraction 的类别,为Fraction 类增加计算两个分数的加减乘除的方法。
FractionMath.h
#import "Fraction.h"
@interface Fraction (Math1)
-(Fraction*) mul: (Fraction*) f;//乘法,就是传入一个Fraction 作为参数,与当前的Fraction
进行计算
-(Fraction*) div: (Fraction*) f;//除法
@end
@interface Fraction (Math2)
-(Fraction*) add: (Fraction*) f;//加法
@end
其实类别就是在你想要扩展的@interface 的名字后面加个( ),里面写上类别的名字,这个名
字必须是唯一的,也就是说一个@interface 只能有一个类别为XXX 的Category。
FractionMath.m
#import "FractionMath.h"
@implementation Fraction (Math1)
-(Fraction*) mul: (Fraction*) f{
return [[Fraction alloc] initWithNumerator: numerator*[f numerator]
denominator: denominator*[f denominator]];
}
-(Fraction*) div: (Fraction*) f{
return [[Fraction alloc] initWithNumerator: numerator*[f denominator]
denominator: denominator*[f numerator]];
}
@end
@implementation Fraction (Math2)
-(Fraction*) add: (Fraction*) f{
return [[Fraction alloc] initWithNumerator:
numerator*[f denominator] + denominator*[f numerator]
denominator: denominator*[f denominator]];
}
@end
类别的实现类也就是类型名后后面加个( ),里面写上类别的名字,其他的没有什么不同的。
上面唯一可能会让你头晕的就是加减乘除的实现代码,实际上就是嵌套调用,写成了一个语
句而已。拿add 的实现来说,就是创建要返回的计算结果Fraction 的实例,然后依据分数相
加要先通分的规则,结果的分子initWithNumber 就是第一个分数的分子*第二个分数的分母,
再加上第二个分数的分子*第一个分数的分母,分母denominator 参数就是两个分数的分母
相乘。
main.m
#import "FractionMath.h"
int main( int argc, const char *argv[] ) {
Fraction *frac1 = [[Fraction alloc] initWithNumerator: 1 denominator: 3];
Fraction *frac2 = [[Fraction alloc] initWithNumerator: 2 denominator: 5];
Fraction *frac3 = [frac1 mul: frac2];
[frac1 print];
printf( " * " );
[frac2 print];
printf( " = " );
[frac3 print];
printf( "\n" );
Fraction *frac5 = [frac1 add: frac2];
[frac1 print];
printf( " + " );
[frac2 print];
printf( " = " );
[frac5 print];
printf( "\n" );
[frac1 release];
[frac2 release];
[frac3 release];
[frac5 release];
return 0;
}

原创粉丝点击