为什么在初始化时使用子类的实现?

时间:2016-05-09 12:16:44

标签: objective-c nsobject

创建了两个类AB,其中B子类A。在尝试初始化B时,它会调用[super init]为什么超类A使用孩子的B}的printMessage实现?

@implementation A

- (instancetype)init
{
    self = [super init];
    if (self) {
        [self printMessage:@"Foo"];
    }
    return self;
}

-(void)printMessage:(NSString *)message
{
    NSLog(@"From A: %@", message);
}

@end

B(子类A)的实施

@implementation B

- (instancetype)init
{
    self = [super init];
    if (self) {
        [self printMessage:@"Bar"];
    }
    return self;
}

-(void)printMessage:(NSString *)message
{
    NSLog(@"From B: %@", message);
}

@end

使用以下方式初始化:

B *b = [[B alloc] init]

预期产出:

From A: Foo
From B: Bar

实际输出:

From B: Foo
From B: Bar

1 个答案:

答案 0 :(得分:1)

您正在初始化B类型的对象。搜索方法实现从类B开始,如果找到它们则使用重写方法,否则只返回父实现。

您的B printMessage必须明确调用[super printMessage: message]才能调用它...就像调用init一样。

尝试将其放在A的{​​{1}}内以澄清事情:

init