2016-05-09 20 views
0

Erstellt zwei Klassen A und B wo B Unterklassen A. Beim Versuch, init B es ruft [super init] Warum verwendet die Superklasse A die Implementierung von des Kindes (B)?Warum wird die Implementierung einer untergeordneten Klasse bei der Initialisierung verwendet?

@implementation A 

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

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

@end 

Durchführung von B (Unterklassen A)

@implementation B 

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

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

@end 

Initialised Verwendung:

B *b = [[B alloc] init]

Erwartete Leistung:

From A: Foo 
From B: Bar 

Actual output:

From B: Foo 
From B: Bar 
+1

Sie haben haben Sie nicht die Mühe gemacht, die Objective-C-Programmierhandbuch zu lesen. – trojanfoe

+0

@trojanfoe Schön und konstruktiv kommentieren ... – Jonathan

+0

Ich muss überhaupt nicht konstruktiv sein. ** Sie ** müssen suchen, bevor Sie sinnlose Fragen stellen. – trojanfoe

Antwort

1

Sie initialisieren ein Objekt vom Typ B. Die Suche nach Methodenimplementierungen beginnt in der Klasse B und verwendet überschriebene Methoden, wenn sie gefunden werden, andernfalls wird nur auf übergeordnete Implementierungen zurückgegriffen.

Ihre B ‚s printMessage hätte ausdrücklich [super printMessage: message] anrufen für sie aufgerufen werden ... genau wie der Anruf zu init.


Versuchen Sie, diese innerhalb A ‚s init, Dinge zu klären:

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