基于iOS平台版本的子类化

基于iOS平台版本的子类化,ios,afnetworking,Ios,Afnetworking,我使用的是AFNetworking,我有一个为AFHTTPSessionManager创建的子类,它在iOS7上工作,我想知道我是否可以继承相同的子类,但使用不同的超类,比如基于一些预处理器指令的AFHTTPRequestOperationManager 谢谢您不能在编译时执行此操作。编译器不知道您的应用程序将在哪个受支持的iOS版本上运行。您可以创建该类的多个版本,并根据运行时版本检查创建正确的版本。处理此问题的“标准”方法是为类函数定义一个接口,然后创建“旧”和“新”类来实现该接口。使用“工

我使用的是AFNetworking,我有一个为AFHTTPSessionManager创建的子类,它在iOS7上工作,我想知道我是否可以继承相同的子类,但使用不同的超类,比如基于一些预处理器指令的AFHTTPRequestOperationManager


谢谢

您不能在编译时执行此操作。编译器不知道您的应用程序将在哪个受支持的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
并为
MyiOS6HttpClient
创建一个类似的类,该类不使用iOS7会话管理

因此,本例中的类集群为您提供:

  • 通过
    MyHttpClient
    MyiOS7HttpClient
    MyIos6HttpClient
    的干净接口

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

  • 不需要消息转发


你是说班级集群?嗯,是的,我想。(我刚刚意识到你说的是Objective-C——出于某种原因,我认为这是针对Java的。但同样的想法也适用——只使用“协议”而不是“接口”。)+1用于工厂。Objective-c实现这一点的方法是使用一个类集群,当您初始化时,它会确定os版本并根据iOS7/6返回正确的实例。在这种情况下不需要消息转发,因为集群中的每个类都将正确响应头中定义的方法。
#import "MyHttpClient.h"

@implementation _MyiOS7HttpClient

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