1
我在objective-c中使用工廠模式,但由於某種原因,它從來沒有調用子類的方法..我會通過代碼解釋:爲什麼Xcode總是使用超類的方法而不是子類
// MailBoxViewController.m -- file using the factory:
SearchWorker* searchWorker = [SearchWorkerFactory getSearchWorker:param];
// whenever I call this method, it's always the one belonging to SearchWorker,
// rather than any of it's children classes, even if on breakpoint here, searchWorker
// is of class type AllSearchWorker
[searchWorker search:[searchParams objectForKey:@"query"] withDelegate:self withSnippedDelims:snippetDelims startWithDB:dbNum];
// searchWorkerFactory.m
#import "SearchWorkerFactory.h"
#import "SearchWorker.h"
#import "AllSearchWorker.h"
@implementation SearchWorkerFactory
+(id)getSearchWorker:(SearchWorkerType)syncType {
if (syncType == SearchWorkerTypeAll) {
AllSearchWorker* searchWorker = [[AllSearchWorker alloc] init];
return searchWorker;
}
return nil;
}
@end
// SearchWorker.h
@interface SearchWorker : NSObject
-(void)search:(NSString *)query withDelegate:(id)delegate withSnippedDelims:(NSArray *)snippedDelims startWithDB:(int)dbIndex;
@property (assign) volatile BOOL cancelled; // flag for when we cancel a search op
@property (nonatomic,readwrite,retain) NSOperationQueue *operationQueue;
@end
// SearchWorker.m
@implementation SearchWorker
..
-(void)search:(NSString *)query withDelegate:(id)delegate withSnippedDelims:(NSArray *)snippedDelims startWithDB:(int)dbIndex {
[NSException raise:NSInternalInconsistencyException
format:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)];
}
@end
// AllSearchWorker.h
@interface AllSearchWorker : SearchWorker
-(void)search:(NSString *)query withDelegate:(id)delegate withSnippetDelims:(NSArray *)snippetDelims startWithDB:(int)dbIndex;
@end
// AllSearchWorker.m
@implementation AllSearchWorker
..
- (void)search:(NSString*)query withDelegate:(id)delegate withSnippetDelims:(NSArray *)snippetDelims startWithDB:(int)dbIndex {
// implementation
}
@end
,所以我總是得到錯誤信息:
*終止應用程序由於未捕獲的異常 'NSInternalInconsistencyException',理由是:「你必須覆蓋 搜索:withDelegate:withSnippedDelims:startWithDB:在子類' *第一次撥打電話:
任何想法爲什麼會發生這種情況?也如果我控制點擊方法search:withDelegate:withSnippedDelims:startWithDB
,xcode立即跳轉到SearchWorker.m
(即它不給我一個文件列表,這種方法存在)..如果我從SearchWorker.m
刪除該方法,它抱怨說,這種方法doesn' t存在..想法?
天啊..有人請我一拳! – abbood 2013-04-11 08:07:13