1

我的 iPhone 应用程序有一个抽象类 WorkingView。它是 UIView 的子类。WorkingView 又会有一堆具体的子类。其中两个将是 SimplifyView 和 MultiplyView。

我正在尝试编写创建 WorkingView 新实例的方法。此方法应传入模式并返回适当的具体子类的实例。根据这个问题的答案,这是我到目前为止所拥有的:

+ (id)newWorkingViewWithFrame:(CGRect)frame mode: (modeEnum) mode {
    WorkingView *ret;
    switch (mode) {
        case simplifyMode:
            ret = [[SimplifyView alloc]initWithFrame: frame];
            break;
        case multiplyMode:
            ret = [[MultiplyView alloc]initWithFrame: frame];
            break;
        // additional cases here
        default:
            return nil;
    }
    // more initialization here
    return ret;
}

到现在为止还挺好。但问题就在这里。在 SimplifyView 的 init 方法中,我需要通过 UIView 的 init 方法运行对象。调用 [super initWithFrame: frame] 只会让我进入 WorkingView,而不是一直到 UIView。我想我可以在 WorkingView 中创建一个 initWithFrame: 方法,该方法又调用 UIView 的 initWithFrame: 方法——但这感觉很老套。

处理此问题的适当方法是什么?

4

1 回答 1

0

如果[super initWithFrame:frame]从子类调用,运行时将爬上继承层次结构,寻找实现该方法的类,从 super 开始。如果 super 没有实现initWithFrame:,runtime 会不断爬升,直到最终找到并调用 UIView 中的默认实现。

于 2010-08-28T06:09:17.483 回答