Capítulo I: Objective-c. Lección 3: Herencia

El tipo de datos id.

En objective-c existe un tipo de datos llamado id. que actúa de manera similar a void*, es decir, puede apuntar a cualquier tipo de objeto, por lo anterior, en objective-c cuando invocamos métodos no se requiere (no obligatoriamente) saber los tipos de los objetos, es suficiente con que el método exista, a esto se le llama pasar un mensaje.

//  Perro.h @interface Perro : NSObject { } -(void) ladra; -(void) corre; @end
//  Perro.m #import “Perro.h” @implementation Perro -(void) ladra {         //Guau guau } -(void) corre {         //trut trut turut } @end
//  Gato.h @interface Gato : NSObject {         -(void) maulla;         -(void) corre; } @end
//  Gato.m #import “Gato.h” @implementation Gato -(void) maulla{         //miauuu miauu } -(void) corre {         //silencio } @end
#include <stdio.h> #import “Perro.h” #import “Gato.h” int main (int argc, const char * argv[]) {         Perro *rintintin=[[Perro alloc] init];         Gato *misifus=[[Gato alloc] init];         id cuadrupedo:         //métodos de cada clase         [rintintin ladra];         [misifus maulla];         cuadrupedo=rintintin; //rintintin es instancia de Perro         [cuadrupedo corre]; //trut trut         //[cuadrupedo maulla]; //Genera excepción ya que Perro no implementa el método maulla         cuadrupedo=misifus; //misifus es una instancia de Gato         [cuadrupedo corre]: //silencio         //[cuadrupedo ladra]; //Genera excepción ya que Gato no implementa el método ladra         //liberar memoria         [rintintin release];         [misifus release];     return 0; }

Podemos invocar los métodos desde ambas clases cuando las asignamos a la variable cuadrupedo, que es tipo id, y por lo tanto no le importa si la instancia a la que apunta tiene implementado el método que se le pasa, ni hay que hacer castings, simplemente intentará enviar el mensaje a la instancia, y si el método no existiera, generaría una excepción.

Herencia.

La herencia en Objective-C es similar a java, se pueden sobreescribir los métodos simplemente escribiendo en la clase hija la nueva definición del método.

//  Mamifero.h #import @interface Mamifero : NSObject {         int patas;         char *nombre; } -(int) getPatas; -(char*) getNombre; -(id) initWithNombre:(char*)_nombre Patas:(int)_patas; @end
//  Mamifero.c #import “Mamifero.h” @implementation Mamifero -(int) getPatas {         return patas; } -(char*) getNombre {         return nombre; } -(id) initWithNombre:(char*)_nombre Patas:(int)_patas {     self = [super init];     if ( self ) {         nombre=_parteReal;         patas=_patas;     }     return self; } @end
//  Perro.h #import #import “Mamifero.h” @interface Perro : Mamifero {     char raza; } -(int) getRaza; -(id) initWithNombre:(char*)_nombre Raza:(char*)_raza; @end
//  Perro.c #import “Perro.h” @implementation Perro -(int) getRaza {         return raza; } -(id) initWithNombre:(char*)_nombre Raza:(char*)_raza {     self = [super initWithNombre:_nombre Patas:4];     if ( self ) {         raza=_raza;     }     return self; } @end
#import “Mamifero.h” #import “Perro.h” #import int main( int argc, const char *argv[] ) {     Mamifero *mamifero = [[Mamiferoalloc] initWithNombre:”Juan Perez” Patas:2];     Perro *perro = [[Perro alloc] initWithNombre:”firulais” Raza:”Rottweiler”];    printf(“\nNumero de Patas Mamifero %d”,[mamifero getPatas]); //2    printf(“\nNumero de Patas Perro %d”,[mamifero getPatas]); //4 asignado automaticamente     [mamifero release];     [perro release];     return 0; }

La herencia es parecida a Java, solo se puede tener una clase padre, y para sobreescribir los métodos, simplemente escribimos una nueva definición en la clase hija.

Saludos!