• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
 在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 定义部分
  1. #import <Foundation/Foundation.h>  
  2.   
  3. @interface NSString(ExtNSString)   
  4.   
  5. -(void) PrintToConSole;  
  6.   
  7. @end  
解释:@interface NSString(ExtNSString) 表示ExtNSString这个类将会扩展NSString,会为其添加一些通用的额外方法。
 
StringUtils.m 实现部分
  1. #import "StringUtils.h"  
  2.   
  3. @implementation NSString(ExtNSString)   
  4.   
  5. -(void) PrintToConSole  
  6. {  
  7.     NSLog(@"%@",self);  
  8. }  
  9.   
  10. @end 
用法例如以下:
  1. #import <Foundation/Foundation.h>  
  2. #import "StringUtils.h"  
  3.   
  4. int main (int argc, const charchar * argv[]) {  
  5.     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];  
  6.   
  7.     NSString* str = @"Hello World!";  
  8.       
  9.     [str PrintToConSole];  
  10.       
  11.     [pool drain];  
  12.     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 (主要用于放一些成员变量。基本上仅仅是一个壳而已)
  1. #import <Foundation/Foundation.h>  
  2.   
  3. @interface BLL : NSObject {   
  4.     NSString* connStr;  
  5. }  
  6.   
  7. -(void) setConnString:(NSString*) connString;  
  8. -(NSString*) connString;  
  9.   
  10. @end 
BLL.m实现
  1. #import "BLL.h"  
  2.   
  3. @implementation BLL  
  4.   
  5. -(void) setConnString:(NSString *)connString  
  6. {  
  7.     connStr = connString;  
  8. }  
  9.   
  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
  1. #import "Product.h"  
  2. #import "BLL.h"  
  3.   
  4. @implementation BLL(Product)  
  5.   
  6. -(void) addProduct: (NSString* )productName productNo:(NSString*)proNo  
  7. {  
  8.     NSLog(@"connString=%@",connStr);//输出Bll.h中定义的成员connStr  
  9.     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  


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C++vsObjectiveC发布时间:2022-07-12
下一篇:
Swift/Objective-C-Swift与Objective-C混用教程发布时间:2022-07-12
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap