我想创建一个带有基类和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语言中的类似代码不起作用并导致无限递归,是吗?这段代码错了吗?
答案 0 :(得分:2)
您的代码是正确的。 [super ...]
始终使用实现该方法的类的超类。在您的代码中,+allocWithZone:
由类Base
实现,因此[super allocWithZone:zone]
在搜索要调用的下一个Base
实现时使用+allocWithZone:
的超类。