2014-03-03 34 views
3

我正在使用AFNetworking,我有一个为AFHTTPSessionManager创建的子类,它在iOS7上工作,我想知道它可能是我可以继承相同的子类,但与不同的超类说AFHTTPRequestOperationManager基于在一些预处理指令上。基于iOS平台的子类版本

谢谢

回答

2

处理这个问题的“标准”方法是为你的类函数定义一个接口,然后创建“旧”和“新”类来实现接口。使用“工厂”为运行时环境创建正确的一个。

您可以改为使用“包装器”类而不是接口 - 它在内部创建特定于版本的类并将调用转发给它。

+1

所以你说的是类集群? – uchuugaka

+0

呃,是的,我想。 (我刚刚意识到你正在谈论Objective-C--由于某种原因,我认为这是针对Java的,但同样的想法也适用 - 只需使用“protocol”而不是“interface”)。 –

+2

+1使用工厂在这里。 Objective-c的做法是使用一个类集群,当你初始化的时候,它决定了os的版本,并根据iOS7/6返回正确的实例。这种情况下不需要消息转发,因为类中的每个类都在群集将正确响应头中定义的方法。 –

0

你不能在编译时做到这一点。编译器不知道应用程序将运行哪个受支持的iOS版本。您可以创建该类的多个版本,并根据运行时版本检查创建正确的版本。

2

应用使用厂(在一类集群的形式)

音符下的代码是唯一的指示,它不会从一个复制/粘贴

@interface MyHTTPClient 

- (void) post:(NSURLRequest *)request params:(NSDictionary *)params 
@end 


@implementation MyHTTPClient 

- (id) init { 
    if(iOS_version < 7) { 
     return [[_MyiOS7HttpClient] alloc] init]; 
    } else { 
     return [[_MyiOS6HttpClient alloc] init]; 
    } 
} 

- (void) post:(NSURLRequest *)request params:(NSDictionary *)params { 
    NSAssert(NO, @"private instances should respond to this"); 
} 
@end 
编译

现在的私人情况,从项目(只能通过MyHttpClient)是不可见的

#import "MyHttpClient.h" 

@implementation _MyiOS7HttpClient 

- (void) post:(NSURLRequest *)request params:(NSDictionary *)params { 
    // use new ios7 session manager here to do stuff 
} 
@end 

,并创建一个类似CL屁股MyiOS6HttpClient它不使用任何iOS7会话管理。

因此,在这种情况下,类簇为您提供:

  • 一个干净的界面要么MyiOS7HttpClient或通过MyHttpClientMyIos6HttpClient

  • 其他代码并不需要知道你实际使用的是哪个实例。

  • 无需消息转发。