Ziel-C-Vererbung

Eines der wichtigsten Konzepte in der objektorientierten Programmierung ist das der Vererbung. Durch Vererbung können wir eine Klasse in Bezug auf eine andere Klasse definieren, was das Erstellen und Verwalten einer Anwendung erleichtert. Dies bietet auch die Möglichkeit, die Codefunktionalität und die schnelle Implementierungszeit wiederzuverwenden.

Beim Erstellen einer Klasse kann der Programmierer festlegen, dass die neue Klasse die Mitglieder einer vorhandenen Klasse erben soll, anstatt vollständig neue Datenelemente und Elementfunktionen zu schreiben. Diese vorhandene Klasse heißtbase Klasse, und die neue Klasse wird als die bezeichnet derived Klasse.

Die Idee der Vererbung setzt die is aBeziehung. Zum Beispiel Säugetier-IS-A-Tier, Hund-IS-A-Säugetier, daher auch Hund-IS-A-Tier und so weiter.

Basis- und abgeleitete Klassen

Objective-C erlaubt nur eine mehrstufige Vererbung, dh es kann nur eine Basisklasse haben, erlaubt jedoch eine mehrstufige Vererbung. Alle Klassen in Objective-C werden von der Oberklasse abgeleitetNSObject.

@interface derived-class: base-class

Betrachten Sie eine Basisklasse Person und seine abgeleitete Klasse Employee wie folgt -

#import <Foundation/Foundation.h>
 
@interface Person : NSObject {
   NSString *personName;
   NSInteger personAge;
}

- (id)initWithName:(NSString *)name andAge:(NSInteger)age;
- (void)print;

@end

@implementation Person

- (id)initWithName:(NSString *)name andAge:(NSInteger)age {
   personName = name;
   personAge = age;
   return self;
}

- (void)print {
   NSLog(@"Name: %@", personName);
   NSLog(@"Age: %ld", personAge);
}

@end

@interface Employee : Person {
   NSString *employeeEducation;
}

- (id)initWithName:(NSString *)name andAge:(NSInteger)age 
  andEducation:(NSString *)education;
- (void)print;
@end

@implementation Employee

- (id)initWithName:(NSString *)name andAge:(NSInteger)age 
   andEducation: (NSString *)education {
      personName = name;
      personAge = age;
      employeeEducation = education;
      return self;
   }

- (void)print {
   NSLog(@"Name: %@", personName);
   NSLog(@"Age: %ld", personAge);
   NSLog(@"Education: %@", employeeEducation);
}

@end

int main(int argc, const char * argv[]) {
   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];        
   NSLog(@"Base class Person Object");
   Person *person = [[Person alloc]initWithName:@"Raj" andAge:5];
   [person print];
   NSLog(@"Inherited Class Employee Object");
   Employee *employee = [[Employee alloc]initWithName:@"Raj" 
   andAge:5 andEducation:@"MBA"];
   [employee print];        
   [pool drain];
   return 0;
}

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

2013-09-22 21:20:09.842 Inheritance[349:303] Base class Person Object
2013-09-22 21:20:09.844 Inheritance[349:303] Name: Raj
2013-09-22 21:20:09.844 Inheritance[349:303] Age: 5
2013-09-22 21:20:09.845 Inheritance[349:303] Inherited Class Employee Object
2013-09-22 21:20:09.845 Inheritance[349:303] Name: Raj
2013-09-22 21:20:09.846 Inheritance[349:303] Age: 5
2013-09-22 21:20:09.846 Inheritance[349:303] Education: MBA

Zugangskontrolle und Vererbung

Eine abgeleitete Klasse kann auf alle privaten Mitglieder ihrer Basisklasse zugreifen, wenn sie in der Schnittstellenklasse definiert ist. Sie kann jedoch nicht auf private Mitglieder zugreifen, die in der Implementierungsdatei definiert sind.

Wir können die verschiedenen Zugriffstypen auf folgende Weise zusammenfassen, je nachdem, wer auf sie zugreifen kann:

Eine abgeleitete Klasse erbt alle Basisklassenmethoden und -variablen mit den folgenden Ausnahmen:

  • Auf Variablen, die mit Hilfe von Erweiterungen in der Implementierungsdatei deklariert wurden, kann nicht zugegriffen werden.

  • Auf Methoden, die mit Hilfe von Erweiterungen in der Implementierungsdatei deklariert wurden, kann nicht zugegriffen werden.

  • Wenn die geerbte Klasse die Methode in der Basisklasse implementiert, wird die Methode in der abgeleiteten Klasse ausgeführt.