在c#中要扩展一个现有类非常easy,比方这样:
1
2
3
4
5
6
7
|
public static class Utils
{
public static void PrintToConsole( this string strSrc)
{
Console.WriteLine(strSrc);
}
}
|
这样就为String类加入了一个PrintToConsole的方法。用法例如以下:
1
2
3
4
5
6
7
|
class MainClass
{
public static void Main
( string []
args)
{
"Hello
World!" .PrintToConsole();
}
}
|
在objective-C中,也有类似的处理办法:
StringUtils.h 定义部分
- #import <Foundation/Foundation.h>
-
- @interface NSString(ExtNSString)
-
- -(void) PrintToConSole;
-
- @end
解释:@interface NSString(ExtNSString) 表示ExtNSString这个类将会扩展NSString,会为其添加一些通用的额外方法。
StringUtils.m 实现部分
- #import "StringUtils.h"
-
- @implementation NSString(ExtNSString)
-
- -(void) PrintToConSole
- {
- NSLog(@"%@",self);
- }
-
- @end
用法例如以下:
- #import <Foundation/Foundation.h>
- #import "StringUtils.h"
-
- int main (int argc, const charchar * argv[]) {
- NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
-
- NSString* str = @"Hello World!";
-
- [str PrintToConSole];
-
- [pool drain];
- return 0;
- }
只是有一点要特别注意:c#中假设开发者添加的扩展方法跟.net框架自带的现有方法重名,实际执行时将以系统自带的现有方法为准。但在obj-C中,这样的情况下开发者新添加的重名方法会覆盖系统原有的方法,并且没有不论什么提示!
一个好的习惯是为全部扩展方法(包含类名),都加一个特殊的前缀或后缀。以避免重名。
下一个话题:partial class
做过asp.net开发的程序猿都知道,c#中的partial class能够方便的将同一个类的代码,分散在多个不同的物理文件里,编译器在编译时能自己主动将它们合并。这是一个非常棒的功能。在团队开发中我常常把一个类的不同业务模块,分散成几个不同的物理文件(比方class_jimmy.cs。class_mike.cs...),然后jimmy仅仅在class_jimmy.cs中写代码。mike仅仅在class_mike.cs中写代码,在非常大程度上这样能够降低(或避免)终于svn提交合并时的冲突。
表面上看,partial class与扩展方法是风马牛不相及的二个概念。可是在obj-C中,这二个事实上是一回事。
场景:比方一个商城系统,对产品的增、删、改定义。我想单独放到文件Product.h中,而对订单的处理,我想单独放到文件Order.h中。可是这些跟业务相关的处理,我想在逻辑上把它们都归到同一个类BLL.h中。
看看obj-C中的做法:(主要是看几个文件是怎样组织成一个类的。代码仅仅是演示样例而已)
1、先定义BLL.h (主要用于放一些成员变量。基本上仅仅是一个壳而已)
- #import <Foundation/Foundation.h>
-
- @interface BLL : NSObject {
- NSString* connStr;
- }
-
- -(void) setConnString:(NSString*) connString;
- -(NSString*) connString;
-
- @end
BLL.m实现
- #import "BLL.h"
-
- @implementation BLL
-
- -(void) setConnString:(NSString *)connString
- {
- connStr = connString;
- }
-
- -(NSString*) connString
- {
- return connStr;
- }
-
- -(void) dealloc
- {
- [connStr release];
- [super dealloc];
- }
- @end
2、再定义Product.h用来扩展BLL类
- #import <Foundation/Foundation.h>
- #import "BLL.h"
-
- @interface BLL(Product)
-
- -(void) addProduct: (NSString* )productName productNo:(NSString*)proNo;
- -(void) deleteProduct:(NSString*) productNo;
-
- @end
Product.m
- #import "Product.h"
- #import "BLL.h"
-
- @implementation BLL(Product)
-
- -(void) addProduct: (NSString* )productName productNo:(NSString*)proNo
- {
- NSLog(@"connString=%@",connStr);
- NSLog(@"addProduct success! productName:%@,productNo:%@",productName,proNo);
- }
-
- -(void) deleteProduct:(NSString*) productNo
- {
- NSLog(@"connString=%@",[self connString]);
- NSLog(@"deleteProduct success! productNo:%@",productNo);
- }
- @end
请发表评论