【发布时间】: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