注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

无线时代辐射无穷

抓紧生宝宝,小心辐射

 
 
 

日志

 
 

objective-C中的扩展方法与partial class  

2011-07-25 14:54:17|  分类: apple |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

在c#中要扩展一个现有类很容易,比如这样:

1 public static class Utils
2 {
3     public static void PrintToConsole(this string strSrc)
4     {
5         Console.WriteLine(strSrc);
6     }   
7 }
这样就为String类添加了一个PrintToConsole的方法,使用方法如下:
1 class MainClass
2 {
3     public static void Main (string[] args)
4     {
5         "Hello World!".PrintToConsole();            
6     }
7 }
在objective-C中,也有类似的处理办法:
StringUtils.h 定义部分
1 #import <Foundation/Foundation.h>
2   
3 @interface NSString(ExtNSString) 
4   
5 -(void) PrintToConSole;
6   
7 @end
解释:@interface NSString(ExtNSString) 表示ExtNSString这个类将会扩展NSString,会为其增加一些通用的额外方法。
 
StringUtils.m 实现部分
01 #import "StringUtils.h"
02   
03 @implementation NSString(ExtNSString) 
04   
05 -(void) PrintToConSole
06 {
07     NSLog(@"%@",self);
08 }
09   
10 @end
使用方法如下:
01 #import <Foundation/Foundation.h>
02 #import "StringUtils.h"
03   
04 int main (int argc, const char * argv[]) {
05     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
06   
07     NSString* str = @"Hello World!";
08       
09     [str PrintToConSole];
10       
11     [pool drain];
12     return 0;
13 }
不过有一点要特别注意: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 (主要用于放一些成员变量,基本上只是一个壳而已)
01 #import <Foundation/Foundation.h>
02   
03 @interface BLL : NSObject
04     NSString* connStr;
05 }
06   
07 -(void) setConnString:(NSString*) connString;
08 -(NSString*) connString;
09   
10 @end
BLL.m实现
01 #import "BLL.h"
02   
03 @implementation BLL
04   
05 -(void) setConnString:(NSString *)connString
06 {
07     connStr = connString;
08 }
09   
10 -(NSString*) connString
11 {
12     return connStr;
13 }
14   
15 -(void) dealloc
16 {
17     [connStr release];
18     [super dealloc];
19 }
20 @end
2、再定义Product.h用来扩展BLL类
1 #import <Foundation/Foundation.h>
2 #import "BLL.h"
3   
4 @interface BLL(Product)
5   
6 -(void) addProduct: (NSString* )productName productNo:(NSString*)proNo;
7 -(void) deleteProduct:(NSString*) productNo;
8   
9 @end
Product.m
01 #import "Product.h"
02 #import "BLL.h"
03   
04 @implementation BLL(Product)
05   
06 -(void) addProduct: (NSString* )productName productNo:(NSString*)proNo
07 {
08     NSLog(@"connString=%@",connStr);//输出Bll.h中定义的成员connStr
09     NSLog(@"addProduct success! productName:%@,productNo:%@",productName,proNo);
10 }
11   
12 -(void) deleteProduct:(NSString*) productNo
13 {
14     NSLog(@"connString=%@",[self connString]);//也可以用属性来访问
15     NSLog(@"deleteProduct success! productNo:%@",productNo);
16 }
17 @end

3、定义Order.h继续扩展BLL类

1 #import <Foundation/Foundation.h>
2 #import "BLL.h"
3   
4 @interface BLL(Order)
5   
6 -(void) createOrder:(NSString*) productNo quantity:(int) amount;
7   
8 @end

Order.m

01 #import "Order.h"
02   
03 @implementation BLL(Order)
04   
05 -(void) createOrder:(NSString*) productNo quantity:(int) amount
06 {
07     NSLog(@"thank you for order our product. productNo:%@,quantity:%d",productNo,amount);
08 }
09   
10 @end

由于Product类与Order类都是扩展自BLL类,所以这三个类在逻辑上都是同一个类BLL,最后来看看如何使用:

01 #import <Foundation/Foundation.h>
02 #import "BLL.h"
03 #import "Product.h"
04 #import "Order.h"
05   
06 int main (int argc, const char * argv[]) {
07     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
08   
09     BLL *bll = [[BLL alloc] init];
10     bll.connString = @"I am connection string.";
11     [bll addProduct:@"iphone4" productNo:@"0001"];//调用Product.h中定义的方法
12     [bll createOrder:@"0001" quantity:5];
13     [bll deleteProduct:@"0001"];//调用Order.h中定义的方法
14     [bll release];      
15     [pool drain];
16     return 0;
17 }

运行结果:

2011-02-26 22:29:30.369 Demo[1292:a0f] connString=I am connection string.
2011-02-26 22:29:30.376 Demo[1292:a0f] addProduct success! productName:iphone4,productNo:0001
2011-02-26 22:29:30.378 Demo[1292:a0f] thank you for order our product. productNo:0001,quantity:5
2011-02-26 22:29:30.379 Demo[1292:a0f] connString=I am connection string.
2011-02-26 22:29:30.380 Demo[1292:a0f] deleteProduct success! productNo:0001

皆大欢喜,很多语言和技术真是“一门通,处处通”,也许:c#中的"扩展方法"与"部分类"的设计灵感正是来自objective-C。

  评论这张
 
阅读(998)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017