gpt4 book ai didi

objective-c - 防止子类重写方法

转载 作者:行者123 更新时间:2023-12-03 07:45:05 31 4
gpt4 key购买 nike

假设有一个像这样初始化的对象

- (void)doInit
{
NSLog(@"In BaseClass init");
}

- (id)init
{
self = [super init];
[self doInit];

return self;
}

它有一个以类似方式初始化的子类

- (void)doInit
{
NSLog (@"In SubClass init");
}

- (id)init
{
self = [super init];
[self doInit];

return self;
}

现在,如果我创建子类的实例,那么我会收到以下输出:

In SubClass init
In SubClass init

实际上,我想要发生的事情是

In BaseClass init
In SubClass init

有没有办法标记 doInit 来表明它不应该被覆盖,或者我是否需要为子类中的所有方法创建唯一的名称?

我不太确定我以前怎么没有遇到过这个问题,但是你就知道了。

编辑:

我明白为什么会发生这种情况,我没想到基类能够调用重写的函数。

我也不能只调用[super doInit];从子类方法中调用,因为 BaseClass 仍然需要调用 doInit,以便创建 BaseClass 的实例仍然有效。如果我调用 [super doInit],我最终仍然会调用 SubClass 的 doInit 两次。

看来答案是否定的,我只需为每个 doInit 指定唯一的名称,例如 doBaseClassInit 和 doSubClassInit。

最佳答案

如果您不想动态绑定(bind)某个方法(即不希望调用子类方法(如果存在)),则需要将其作为 C 函数来执行。因此,您可以这样做:

在基类中:

static void DoInit(BaseClass *self)
{
NSLog(@"In BaseClass init");
}

- (id)init
{
self = [super init];
if (self) {
DoInit(self);
}
return self;
}

在子类中:

static void DoInit(SubClass *self)
{
NSLog(@"In SubClass init");
}

- (id)init
{
self = [super init];
if (self) {
DoInit(self);
}
return self;
}

请注意,两个 DoInit 方法都被标记为 static,因此它们仅对每个编译单元(.m 文件)可见,并且不会相互冲突。

关于objective-c - 防止子类重写方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12547823/

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