在没有重写方法的情况下调用Objective-C超类实现

时间:2014-03-09 23:21:58

标签: objective-c override subclass super

看起来,当从一个已经覆盖某些方法的子类发送超类时,你不能通过使用super来获得“原始”实现。任何工作或者我应该开始超级班吗?

这里有一些代码显示我的意思:

@interface ClassA : NSObject

- (void)method1;

@end


@implementation ClassA

- (void)method1
{
    [self method2];
}

- (void)method2
{
    NSLog(@"Hello it's ClassA");
}

@end


@interface ClassB : ClassA

- (void)method3;

@end


@implementation ClassB

- (void)method2  // overriding method2
{
    NSLog(@"Hello it's ClassB");
}

- (void)method3
{
    [self method1]; // logs "Hello it's Class B" as expected
    [super method1]; // still logs "Hello it's ClassB" instead of "Hello it's ClassA”!?
}

@end

提前感谢任何帮助:)

1 个答案:

答案 0 :(得分:2)

表现如预期;您已实例化ClassB的实例,并且,当method1调用[self method2]时,方法调度遵循正常的查找路径。 selfClassB的实例。

将其复制/粘贴到您的所有方法中:

NSLog(@"%s %p %@", __PRETTY_FUNCTION__, self, self);

这应该清楚说明发生了什么。

  

任何工作?

是的,不要这样做,因为设计很差。超类第二次猜测继承是一种可靠的方法,最终导致无法维护的代码库混乱。