用工厂方法替换构造函数

时间:2014-08-01 06:41:14

标签: java objective-c

在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.hChild2.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

1 个答案:

答案 0 :(得分:0)

您需要在子项中转发声明父项。

这是一个解释obj-c中前向声明的链接: Objective-C: Forward Class Declaration

添加

@class Parent; 

在child1.h,child2.h。

在child1.m,child2.m中,您可以包含Parent.h