Héritage Objective-C
L'un des concepts les plus importants de la programmation orientée objet est celui de l'héritage. L'héritage nous permet de définir une classe en termes d'une autre classe, ce qui facilite la création et la maintenance d'une application. Cela offre également la possibilité de réutiliser la fonctionnalité de code et un temps de mise en œuvre rapide.
Lors de la création d'une classe, au lieu d'écrire des membres de données et des fonctions membres complètement nouveaux, le programmeur peut désigner que la nouvelle classe doit hériter des membres d'une classe existante. Cette classe existante s'appelle lebase class, et la nouvelle classe est appelée derived classe.
L'idée d'héritage met en œuvre le is arelation. Par exemple, un mammifère IS-A animal, un chien IS-A mammifère, donc un chien IS-A également et ainsi de suite.
Classes de base et dérivées
Objective-C autorise uniquement l'héritage multiniveau, c'est-à-dire qu'il ne peut avoir qu'une seule classe de base mais autorise l'héritage multiniveau. Toutes les classes d'Objective-C sont dérivées de la superclasseNSObject.
@interface derived-class: base-class
Considérez une classe de base Person et sa classe dérivée Employee comme suit -
#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;
}
Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -
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
Contrôle d'accès et héritage
Une classe dérivée peut accéder à tous les membres privés de sa classe de base si elle est définie dans la classe d'interface, mais elle ne peut pas accéder aux membres privés définis dans le fichier d'implémentation.
Nous pouvons résumer les différents types d'accès selon qui peut y accéder de la manière suivante -
Une classe dérivée hérite de toutes les méthodes et variables de classe de base avec les exceptions suivantes -
Les variables déclarées dans le fichier d'implémentation à l'aide d'extensions ne sont pas accessibles.
Les méthodes déclarées dans le fichier d'implémentation à l'aide d'extensions ne sont pas accessibles.
Dans le cas où la classe héritée implémente la méthode dans la classe de base, la méthode de la classe dérivée est exécutée.