1.8 用一个Category来扩展一个类

1、问题

你想要给一个类添加方法和行为,但你不想从头创建一个全新的子类。

2、解决方案

在Objective-C中,你可以用categories来定义和实现properties和methods,之后它们可以被附到一个类上。要完成这件事,你需要有2个文件:一个头文件列出接口、一个实现文件列出实现。当category搞好了,就可以导入该category头文件;任何将该category赋予其之上的类将会拥有这些properties和methods。

4、原理

你需要的第1个东西就是头文件。就说,你要扩展NSString类,加一些方法帮助你创建HTML文本。

下面是一个category头文件,里面有一个接口,代码如下:

@interface NSString (HTMLTags)

上面的NSString就是你要扩展的类。这意味着该category可能只会被运用到NSString(或NSString的子类)。在类名后面圆括号中的是给category的名字。

该category的properties和methods都要放在interface的后面,@end的前面。

实现:

@implementation NSString (HTMLTags)

5、代码

Listing 1-13. HTMLTags.h 

#import <Foundation/Foundation.h> 

@interface NSString (HTMLTags) 

-(NSString *) encloseWithParagraphTags; 

@end

==========================================

Listing 1-14. HTMLTags.m 

#import "HTMLTags.h" 

@implementation NSString (HTMLTags) 

-(NSString *) encloseWithParagraphTags{ 

        return [NSString stringWithFormat:@"<p>%@</p>",self]; 

@end

===========================================

Listing 1-15. main.m 

#import "HTMLTags.h" 

int main (int argc, const char * argv[]){ 

        @autoreleasepool { 

                NSString *webText = @"This is the first line of my blog post"; 

                //Print out the string like normal: 

                NSLog(@"%@", webText); 

                //Print out the string using the category function: 

                NSLog(@"%@", [webText encloseWithParagraphTags]); 

        } 

        return 0; 

6、使用

Categories通常用在这些情形下:你想避免创建一个复杂的继承层次。Categories also help your code remain readable.例如,你想要在项目中用一个category来扩展NSString,你的大多数代码对于使用过NSString的其他人来说都是熟悉的。假如写一个NSString的子类,例如NSHTMLString,就可能会导致困惑。

猜你喜欢

转载自zsjg13.iteye.com/blog/2225853
1.8