编译时静态超绑定?

时间:2014-02-15 10:06:52

标签: objective-c

我想创建一个带有基类和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)?就好像从Base继承的allocWithZone:方法调用一样,总是只相对于Base进行超级计算,而不是调用者的实际运行时类。我认为Java和其他OO语言中的类似代码不起作用并导致无限递归,是吗?这段代码错了吗?

1 个答案:

答案 0 :(得分:2)

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