【问题标题】:super bound statically at compile time?在编译时静态超级绑定?
【发布时间】:2014-02-15 10:06:52
【问题描述】:

我想创建一个包含一个基类和 2 个子类的类集群。创建基类的实例应该根据某些条件返回一个子类,但是直接创建一个子类应该创建它。我在基类中写了如下代码:

+ (id)allocWithZone:(NSZone *)zone {
    // prevent infinite recursion
    if ([self isEqual:Base.class]) {
        // if self is the base class, return a correct subclass
        if (somecondition) {
            return [SubclassA alloc];
        }
        return [SubclassB alloc];
    }
    // otherwise, alloc is called on a subclass
    // call NSObject's alloc
    return [super allocWithZone:zone];
}

它有效,但我真的很惊讶它确实有效。即,当在子类上调用时,为什么 super 评估为 Base 类的超类 (NSObject),而不是 Base 类(因为在 SubclassA 上调用,超类是 Base)?就好像 allocWithZone: 方法调用,从 Base 继承,只是总是相对于 Base 评估 super,而不是调用者的真正运行时类。我认为 Java 和其他 OO 语言中的类似代码不起作用并导致无限递归,是吗?这段代码错了吗?

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    您的代码是正确的。 [super ...] 总是使用实现该方法的类的超类。在您的代码中,+allocWithZone: 由类Base 实现,因此[super allocWithZone:zone] 在搜索要调用的下一个+allocWithZone: 实现时使用Base 的超类。

    【讨论】:

    • 这是否记录在某处?我尝试在 clang 文档中四处寻找,但没有找到。
    猜你喜欢
    • 2014-03-30
    • 2015-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-28
    相关资源
    最近更新 更多