我正在使用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返回正確的實例。這種情況下不需要消息轉發,因爲類中的每個類都在羣集將正確響應頭中定義的方法。 –