2014-03-03 32 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

  • 其他代碼並不需要知道你實際使用的是哪個實例。

  • 無需消息轉發。