在Java中,工厂构造函数可以在抽象超类中定义,如:
public static Parent createChildFromType(int type) {
switch (type) {
case 0:
return new Child1();
case 1:
return new Child2();
default:
throw new Exception();
}
}
但是,在Objective-C中,我为case 1
得到了一个'没有已知的选择器类方法“alloc”':
#import "Child1.h"
#import "Child2.h"
@implementation Parent
+(id)createChildFromType:(int)type {
switch (type) {
case 0:
return [[Child1 alloc]init];
case 1:
return [[Child2 alloc]init];
default:
@throw [NSException exceptionWithName:NSInternalInconsistencyException
reason:@"Invalid subclass type."
userInfo:nil];
}
}
-(void)someAbstractMethod {
@throw [NSException exceptionWithName:NSInternalInconsistencyException
reason:[NSString stringWithFormat:@"You must override %@ in a subclass.",
NSStringFromSelector(_cmd)]
userInfo:nil];
}
@end
Child1.h
和Child2.h
都有#import "Parent.h"
,因为我想事先调用someAbstractMethod
,而不知道我正在调用它的子类:
-(void)someVoodooMethod:(int) type {
Parent *child = [Parent createChildFromType: type];
[child someAbstractMethod];
}
我预感到这是因为#import "Parent.h"
中存在多余的@implementation Parent
,但我还没想过要解决这个问题。有什么建议吗?
修改
我想应该包含Child1.h
的代码:
#import "Parent.h"
@interface Child1 : Parent
@end
Child2.h
#import "Parent.h"
@interface Child2 : Parent
@end
答案 0 :(得分:0)
您需要在子项中转发声明父项。
这是一个解释obj-c中前向声明的链接: Objective-C: Forward Class Declaration
添加
@class Parent;
在child1.h,child2.h。
在child1.m,child2.m中,您可以包含Parent.h