gpt4 book ai didi

objective-c - 你怎么知道是否调用 Objective C 中的父类(super class)方法

转载 作者:太空狗 更新时间:2023-10-30 03:44:18 26 4
gpt4 key购买 nike

子类扩展了父类。 Parent 实现协议(protocol) C,该协议(protocol)具有可选方法,包括 -(void)d。 Child 有一个 -d 的实现;它应该调用 [super d] 吗?

换句话说,当且仅当某些东西响应它时,我写什么代码来调用[super d]?假设我不控制 Parent 的实现;它可能随时更改。

这就是我想到的所有方法。我目前使用的是数字 4。

显然明智的答案 1:

[super d]; // Delete this line if a runtime exception occurs when you try it

这是行不通的,因为 Parent 可能会动态实现 -d,所以这在您测试它时有效,而不是在现场。或者 Parent 的实现可能会发生变化,因此该测试的结果不再正确。

显然明智的答案 2:

if ([super respondsToSelector:_cmd])
[super d];

这不起作用,因为 NSObject 的 -respondsToSelector 实现将在 Child 中找到实现并在所有情况下返回 YES。

显然明智的答案 3:

if ([[self superclass] instancesRespondToSelector:_cmd])
[super d];

当且仅当父类(super class)知道它总是实现 -d 时,这才有效;如果实例动态确定此方法是否存在,则此技术将不起作用。优于 1,因为它将在运行时获取对 Parent 实现的静态更改。

显然明智的答案 4:

@try
{
[super d];
}
@catch (NSException *exception)
{
NSString *templateReason = [NSString stringWithFormat:
@"-[%@ %@]: unrecognized selector sent to instance %p"
,NSStringFromClass([self superclass])
,NSStringFromSelector(_cmd)
,self];
if (![exception.reason isEqualToString:templateReason])
@throw exception;
}

如果父类(super class)中的方法不存在,则此方法的性能很差,因为计算 templateReason 然后将其与异常原因进行比较是昂贵的。

这种机制很脆弱,因为在这种情况下异常原因字符串的格式可能会在未来的 SDK 或运行时版本中更改。

最佳答案

这些都不是必需的。

如果您正在对某个类或其他类进行子类化,您已经需要知道您是在替换还是补充行为。

换句话说,如果实现存在并且您希望它以不同的方式完成,则不要调用 super。

如果实现不存在,则不调用 super。

如果实现确实存在,但你想补充它,你调用super。

附录:

实现是否可以随时更改与您的问题无关;重要的是界面是否改变。

如果 interface 不断变化,则该类极有可能不适合子类化,甚至不适合使用。

关于objective-c - 你怎么知道是否调用 Objective C 中的父类(super class)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8243323/

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