object-c学习:类别Category

原创 2012年03月21日 13:58:07

一直不明白类别的意思,因为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;
}

objective-c的categories(分类)

objective-c的categories(分类)  一,当你想要为某个class 新增methods,你通常会扩充(extend,即继承)它。然而这不一定是个完美解法,特别是你想要重写一个cla...
  • tenfyguo
  • tenfyguo
  • 2013年06月26日 18:25
  • 2519

【Object-C】类别与扩展Category

Object-C 的动态特征允许使用类别为现有的类添加新方法,并且不需要创建子类,不需要访问原有类的源代码。 通过使用类别,可以动态的为现有的类添加新方法,而且可以将类定义模块化的分布到多个相关文件中...
  • sinat_15735647
  • sinat_15735647
  • 2014年11月30日 11:36
  • 788

Category 分类、类别 总结 - iOS

分类作用分类:可以给某一个类扩充一些方法(不修改原来类的代码)格式// 声明 @interface Person (分类名称)@end// 实现 @implementation Person (分类名...
  • zyq522376829
  • zyq522376829
  • 2016年08月13日 20:59
  • 1109

Object-C Category和Extension的区别

参考:http://stackoverflow.com/questions/3499704/difference-between-category-and-class-extension
  • yasi_xi
  • yasi_xi
  • 2014年11月14日 16:11
  • 6076

Xcode7创建类别Category

1、File->new file 2、选择Category->next 3、next ->完成
  • u013935547
  • u013935547
  • 2016年05月17日 19:03
  • 6597

【Objective-C】OC中类别(Category)基本概念与用法

类别(Category)的基本概念      封装是面向对象的一个特征,OC也不例外,但是有的时候我们会碰到这样的一种情况,不如我封装了一个类, 不想再动它了,可是随着程序功能的增加,需要在那个类...
  • jiangqq781931404
  • jiangqq781931404
  • 2014年02月10日 08:19
  • 3249

Object-C 学习笔记(二十)---类目(类别)Category

类目:可以扩充不能被继承的类的功能(方法),属于公有,跟在类里写没区别可以被子类继承,一般不要覆盖原来类的方法,因为延展的执行级别比原本类高. 注意: (1)不能添加实例变量        ...
  • dragonzard
  • dragonzard
  • 2013年12月19日 13:33
  • 539

[IOS] 引用第三方库 类目(Category)无法加载的问题

这个 bug 在 xcode 4.3 以下会出现,4.3 以后已经修正了。 解决方法为:找到 target 的图标,更改其 Other Linker Flags 为: -all_load 或 -...
  • u012703795
  • u012703795
  • 2014年04月28日 15:07
  • 1365

类别(Category)的作用(零)

类别——一种为现有的类添加新方法的方式。 利用Objective-C的动态运行时分配机制,可以为现有的类添加新方法,这种为现有的类添加新方法的方式称为类别(catagory)。他可以为任何类添加新的...
  • lxubin
  • lxubin
  • 2016年07月31日 11:23
  • 1325

iOS 常用Category类别分享

iOS 常用Category类别分享 字数1340 阅读86 评论2 喜欢8 前言      各位都知道,类别是一种为现有的类添加新方法的方式,利用Objective-C的动态运...
  • qq_30513483
  • qq_30513483
  • 2016年07月29日 20:34
  • 2634
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:object-c学习:类别Category
举报原因:
原因补充:

(最多只允许输入30个字)