gpt4 book ai didi

objective-c - 在编译时 super 静态绑定(bind)?

转载 作者:搜寻专家 更新时间:2023-10-30 20:18:07 25 4
gpt4 key购买 nike

我想创建一个具有基类和 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 类的父类(super class) (NSObject),而不是 Base 类(因为在 SubclassA 上调用,父类(super class)是 Base)?就好像从 Base 继承的 allocWithZone: 方法调用总是相对于 Base 计算 super,而不是调用者的真正运行时类。我认为 Java 和其他 OO 语言中的类似代码不会起作用并导致无限递归,对吗?这段代码有错吗?

最佳答案

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

关于objective-c - 在编译时 super 静态绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21796083/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com