gpt4 book ai didi

objective-c - 使基类调用子类中的方法

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

作为一名 C#/Java 程序员,我很难解决以下问题:

有一个基类“B”。在其初始化方法中,它调用方法“SetupStuff”。对于基类,此方法只是空的。

然后有一个继承自“B”的派生类“D”。D 也实现了方法“SetupStuff”(并且实际上在那里做了一些事情)。

问题是:当我创建 D 的对象时,它的“SetupStuff”从未被调用。调用B的init方法,然后调用空的“SetupStuff”。

我需要做什么才能调用派生类的方法?

最佳答案

如果你试图从你的初始化器中调用一个重写,它是行不通的。原因很容易理解:由于override属于子类,并且因为父类(super class)实例初始化需要完成才能开始子类初始化,所以调用派生方法就违反了“常规”时的规则"方法被调用,实例的初始化已经完成。通常,出于同样的确切原因,从 Java 或 C# 构造函数调用虚拟不是一个好主意。在 C++ 中,从构造函数调用虚拟会重定向到构造函数自己的类中的实现(即,与您在 Objective C 中观察到的相同)。

与不允许覆盖静态方法的 C# 和 Java 不同,Objective C 允许您提供类方法的类特定实现。您可以使用这种机制来实现您想要做的事情:在派生类中定义一个类方法,然后从基类中调用它,如下所示:

@interface TT : NSObject
-(id)init;
@end

@interface Test1 : TT
+(void)doit;
@end

@interface Test2 : TT
+(void)doit;
@end

@implementation Test1
+(void) doit {
NSLog(@"Test1");
}
@end

@implementation Test2
+(void) doit {
NSLog(@"Test2");
}
@end

@implementation TT
-(id) init {
if (self=[super init]) {
// The "magic" is in the following line:
[self->isa doit];
}
return self;
}
@end

当你打电话时

[[Test1 alloc] init];
[[Test2 alloc] init];

你看

Test1
Test2

在日志中。

关于objective-c - 使基类调用子类中的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11474057/

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