Herencia de Objective-C
Uno de los conceptos más importantes de la programación orientada a objetos es el de herencia. La herencia nos permite definir una clase en términos de otra clase, lo que facilita la creación y el mantenimiento de una aplicación. Esto también brinda la oportunidad de reutilizar la funcionalidad del código y un tiempo de implementación rápido.
Al crear una clase, en lugar de escribir miembros de datos y funciones de miembros completamente nuevos, el programador puede designar que la nueva clase herede los miembros de una clase existente. Esta clase existente se llamabase clase, y la nueva clase se conoce como el derived clase.
La idea de herencia implementa la is arelación. Por ejemplo, mamífero IS-A animal, perro IS-A mamífero, por lo tanto perro IS-A animal también y así sucesivamente.
Clases base y derivadas
Objective-C solo permite la herencia multinivel, es decir, puede tener solo una clase base pero permite la herencia multinivel. Todas las clases en Objective-C se derivan de la superclaseNSObject.
@interface derived-class: base-class
Considere una clase base Person y su clase derivada Employee como sigue -
#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;
}
Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:
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
Control de acceso y herencia
Una clase derivada puede acceder a todos los miembros privados de su clase base si está definida en la clase de interfaz, pero no puede acceder a los miembros privados que están definidos en el archivo de implementación.
Podemos resumir los diferentes tipos de acceso según quién pueda acceder a ellos de la siguiente manera:
Una clase derivada hereda todos los métodos y variables de la clase base con las siguientes excepciones:
Las variables declaradas en el archivo de implementación con la ayuda de extensiones no son accesibles.
Los métodos declarados en el archivo de implementación con la ayuda de extensiones no son accesibles.
En caso de que la clase heredada implemente el método en la clase base, entonces se ejecuta el método en la clase derivada.