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.
No hay comentarios:
Publicar un comentario