我正在使用AFNetworking,我有一个为AFHTTPSessionManager创建的子类,它在iOS7上工作,我想知道它可能是我可以继承相同的子类,但与不同的超类说AFHTTPRequestOperationManager基于在一些预处理指令上。基于iOS平台的子类版本
谢谢
我正在使用AFNetworking,我有一个为AFHTTPSessionManager创建的子类,它在iOS7上工作,我想知道它可能是我可以继承相同的子类,但与不同的超类说AFHTTPRequestOperationManager基于在一些预处理指令上。基于iOS平台的子类版本
谢谢
处理这个问题的“标准”方法是为你的类函数定义一个接口,然后创建“旧”和“新”类来实现接口。使用“工厂”为运行时环境创建正确的一个。
您可以改为使用“包装器”类而不是接口 - 它在内部创建特定于版本的类并将调用转发给它。
你不能在编译时做到这一点。编译器不知道应用程序将运行哪个受支持的iOS版本。您可以创建该类的多个版本,并根据运行时版本检查创建正确的版本。
应用使用厂(在一类集群的形式)
音符下的代码是唯一的指示,它不会从一个复制/粘贴
@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
或通过MyHttpClient
MyIos6HttpClient
,
其他代码并不需要知道你实际使用的是哪个实例。
无需消息转发。
所以你说的是类集群? – uchuugaka
呃,是的,我想。 (我刚刚意识到你正在谈论Objective-C--由于某种原因,我认为这是针对Java的,但同样的想法也适用 - 只需使用“protocol”而不是“interface”)。 –
+1使用工厂在这里。 Objective-c的做法是使用一个类集群,当你初始化的时候,它决定了os的版本,并根据iOS7/6返回正确的实例。这种情况下不需要消息转发,因为类中的每个类都在群集将正确响应头中定义的方法。 –