2016-05-09 1 views
0

Созданы два класса A и B, где B подклассы A. При попытке инициализировать B он вызывает [super init] Почему суперкласс A использует реализацию ребенка (B) printMessage?Почему реализация класса child используется при инициализации?

@implementation A 

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

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

@end 

Осуществление B (подклассов)

@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

Вы не беспокоили чтения руководство по программированию Objective-C у вас. – trojanfoe

+0

@trojanfoe Хороший и конструктивный комментарий там ... – Jonathan

+0

Мне не нужно быть конструктивным вообще. ** Вам нужно искать, прежде чем отправлять бессмысленные вопросы. – trojanfoe

ответ

1

Вы инициализируете объект типа B. Поиск реализации метода начинается в классе B и использует переопределенные методы, если они найдены, но в противном случае возвращается к родительским реализациям.

Ваш B «ы printMessage бы явно вызвать [super printMessage: message] для того, чтобы быть вызван ... так же, как призыв к init.


Попробуйте положить это в A «s init прояснить вещи:

NSLog(@"I'm a %@", NSStringFromClass([self class]));