objective-C中的擴充方法與partial class

來源:互聯網
上載者:User
 在c#中要擴充一個現有類很容易,比如這樣:
public static class Utils{public static void PrintToConsole(this string strSrc){Console.WriteLine(strSrc);}}
這樣就為String類添加了一個PrintToConsole的方法,使用方法如下:
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 char * 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);//輸出Bll.h中定義的成員connStrNSLog(@"addProduct success! productName:%@,productNo:%@",productName,proNo);}-(void) deleteProduct:(NSString*) productNo{NSLog(@"connString=%@",[self connString]);//也可以用屬性來訪問NSLog(@"deleteProduct success! productNo:%@",productNo);}@end

3、定義Order.h繼續擴充BLL類

#import <Foundation/Foundation.h>#import "BLL.h"@interface BLL(Order)-(void) createOrder:(NSString*) productNo quantity:(int) amount;@end

Order.m

#import "Order.h"@implementation BLL(Order)-(void) createOrder:(NSString*) productNo quantity:(int) amount{NSLog(@"thank you for order our product. productNo:%@,quantity:%d",productNo,amount);}@end

由於Product類與Order類都是擴充自BLL類,所以這三個類在邏輯上都是同一個類BLL,最後來看看如何使用:

#import <Foundation/Foundation.h>#import "BLL.h"#import "Product.h"#import "Order.h"int main (int argc, const char * argv[]) {    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];BLL *bll = [[BLL alloc] init];bll.connString = @"I am connection string.";[bll addProduct:@"iphone4" productNo:@"0001"];//調用Product.h中定義的方法[bll createOrder:@"0001" quantity:5];[bll deleteProduct:@"0001"];//調用Order.h中定義的方法[bll release];    [pool drain];    return 0;}

運行結果:

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。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.