【问题标题】:Objective-C inheritance; calling overridden method from superclass?Objective-C 继承;从超类调用重写的方法?
【发布时间】:2010-12-25 21:29:28
【问题描述】:

我有一个 Objective-C 类,它有一个方法被覆盖,它用于不同的方法。像这样的:

@interface BaseClass
- (id)overrideMe;
- (void)doAwesomeThings;
@end

@implementation BaseClass
- (id)overrideMe {
    [self doesNotRecognizeSelector:_cmd];
    return nil;
}
- (void)doAwesomeThings {
    id stuff = [self overrideMe];
    /* do stuff */
}
@end

@interface SubClass : BaseClass
@end

@implementation SubClass
- (id)overrideMe {
    /* Actually do things */
    return <something>;
}
@end

但是,当我创建一个SubClass 并尝试使用它时,它仍然会在BaseClass 上调用overrideMe 并由于doesNotRecognizeSelector: 而崩溃。 (我没有做[super overrideMe] 或类似的愚蠢行为)。

有没有办法让BaseClass 调用被覆盖的overrideMe

【问题讨论】:

  • 只是为了确保我的理解是否正确,你打电话给[subclassInstance overrideMe] 并且由于doesNotRecognizeSelector: 而崩溃?听起来有点奇怪,但如果我是你,我首先要检查的是在覆盖时我是否正确拼写了方法的名称(如果你在实现中拼错了方法的名称,编译器不会抱怨,当您调用正确的方法名称时,它不会被覆盖)...

标签: objective-c oop inheritance


【解决方案1】:

您在此处描述的内容应该有效,因此您的问题可能存在于其他地方,但我们没有足够的信息来帮助诊断它。

根据您的描述,我会说您发送消息的实例不是您认为的类,或者您在声明方法名称时在代码中输入了一些错字。

在 gdb 下运行您的应用程序,在 objc_exception_throw 上添加一个符号断点,重现您的问题。一旦您的进程因“doesNotRecognizeSelector”异常而停止,请打印对象描述及其类。

或者在调用 -overrideMe 之前记录它:

NSLog(@"object: %@ class: %@", obj, [obj class])

【讨论】:

  • 这是个好建议。我最终使用了一个协议,实际上它更适合这种特殊情况,但是谢谢!
  • @AnshuChimala 如果这个问题得到解决,别忘了接受答案。
【解决方案2】:

BaseClass 编写一个类别以覆盖该方法。

@interface BaseClass (MyCategory)
- (id) overrideMe;
@end

@implementation BaseClass (MyCategory)
- (id) overrideMe
{
    /* Actually do things */    
    return <something>;
}

@end

现在BaseClass 的所有实例都将使用新实现响应选择器overrideMe

【讨论】:

  • 这是一个非常糟糕的建议:欺骗 Objective C,因为您没有找到为什么您的代码(显然)没有按应有的方式工作。
猜你喜欢
  • 1970-01-01
  • 2019-01-19
  • 1970-01-01
  • 2010-12-11
  • 1970-01-01
  • 2011-10-17
  • 2018-01-05
  • 1970-01-01
相关资源
最近更新 更多