2016-05-09 13 views
0

創建了兩個類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

你沒有打擾閱讀的Objective-C編程指南中有你。 – trojanfoe

+0

@trojanfoe尼斯和建設性的評論那裏... – Jonathan

+0

我不需要是建設性的。 **您需要在發佈無意義的問題之前進行搜索。 – trojanfoe

回答

1

您正在初始化B類型的對象。方法實現的搜索從類B開始,如果找到它們,則使用重寫的方法,否則僅返回到父實現。

您的BprintMessage必須明確地調用[super printMessage: message]才能被調用......就像調用init一樣。


試着把這裏面Ainit澄清事情:

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