Ereditarietà Objective-C
Uno dei concetti più importanti nella programmazione orientata agli oggetti è quello dell'ereditarietà. L'ereditarietà ci consente di definire una classe in termini di un'altra classe, il che semplifica la creazione e la manutenzione di un'applicazione. Ciò offre anche l'opportunità di riutilizzare la funzionalità del codice e tempi di implementazione rapidi.
Quando si crea una classe, invece di scrivere membri dati e funzioni membro completamente nuovi, il programmatore può designare che la nuova classe erediti i membri di una classe esistente. Questa classe esistente è chiamatabase class e la nuova classe è indicata come derived classe.
L'idea di eredità implementa il is arelazione. Ad esempio, mammifero È-A animale, cane È-A mammifero, quindi anche cane È-A animale e così via.
Classi base e derivate
Objective-C consente solo l'ereditarietà multilivello, cioè può avere solo una classe base ma consente l'ereditarietà multilivello. Tutte le classi in Objective-C derivano dalla superclasseNSObject.
@interface derived-class: base-class
Considera una classe base Person e la sua classe derivata Employee come segue -
#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;
}
Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:
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
Controllo degli accessi ed ereditarietà
Una classe derivata può accedere a tutti i membri privati della sua classe base se è definita nella classe dell'interfaccia, ma non può accedere ai membri privati definiti nel file di implementazione.
Possiamo riassumere le diverse tipologie di accesso a seconda di chi può accedervi nel modo seguente:
Una classe derivata eredita tutti i metodi e le variabili della classe base con le seguenti eccezioni:
Le variabili dichiarate nel file di implementazione con l'aiuto delle estensioni non sono accessibili.
I metodi dichiarati nel file di implementazione con l'aiuto delle estensioni non sono accessibili.
Nel caso in cui la classe ereditata implementa il metodo nella classe base, viene eseguito il metodo nella classe derivata.