【问题标题】:Class cluster initialization类集群初始化
【发布时间】:2010-08-28 04:40:14
【问题描述】:

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

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

+ (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: 方法——但这感觉很hackish。

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

【问题讨论】:

    标签: iphone objective-c class-cluster


    【解决方案1】:

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

    【讨论】:

    • 是的——但我不喜欢依赖于 WorkingView 中缺少 initWithFrame: 方法——感觉很脆弱。
    • 不,这并不脆弱。直接调用超超类的 init-Method 会很脆弱。
    猜你喜欢
    • 1970-01-01
    • 2019-05-19
    • 1970-01-01
    • 2020-12-07
    • 2015-08-08
    • 2013-07-27
    • 2018-01-12
    • 2020-05-31
    • 1970-01-01
    相关资源
    最近更新 更多