Objetos, clases, variables y demás bestias

La programación con Cocoa y Objective-C es una programación orientada a objetos. ….. Pues muy bien y eso que significa …..

A nivel teórico hay mucho que decir (a ver si alguien se anima). Pero a nivel práctico significa que los programas estarán compuestos de “entidades” que enviándose mensajes entre ellos realizarán las tareas. Como la programación orientada a objetos, sus ventajas y maravillas se explican en muchos sitios, y simplemente voy a explicar lo mínimo para poder trabajar

Definición de una clase

Cada clase se tiene que guardar en dos ficheros diferentes. El primero acabará en .h y contiene las definiciones de la clase. El segundo acabará en .m y contiene el código que marca lo que contiene ese objeto y que puede hacer con ello (Espero entender algún día por qué hacen falta dos ficheros).

La definición de una clase tiene dos partes, en primer lugar datos del objeto (guardadas en variables) y en segundo lugar que métodos tendremos para hacer cosas con esos datos (darles valores, cambiarlos, verlos, …). Veamos un ejemplo:

//  Complejo.h
//  Objetos
//
//  Created by Luis Rey Cabrerizo on 16/12/07.
//  Copyright 2007 LRC. All rights reserved.
//
#import <  Cocoa/Cocoa.h  >
@interface Complejo : NSObject {

   float partReal;
   float partImaginaria;
}
- print;
- (void) setReal: (float) Re;
- (void) setImaginaria: (float) Im;
- (float) real;
- (float) imaginaria;

@end

en el código anterior se definen dos variables para guardar datos: float partReal y float partImaginaria. Y también se definen cinco métodos para interactuar con los datos; print, partReal, partImaginaria, real, imaginaria.

La implementación de la clase definida antes es:

//  Complejo.m
//  Objetos
//
//	Ejemplo del trabajo con objetos en Objective-C y Cocoa
//  Definición de la clase complejos
//
//  Created by Luis Rey Cabrerizo on 16/12/07.
//  Copyright 2007 LRC. All rights reserved.
//

#import "Complejo.h"
@implementation Complejo
// Crea una cadena con el número preparada
// para imprimir ya formateada
- print{
    return [NSString stringWithFormat: @"%f + %fi", partReal, partImaginaria];
}

// Asigna un valor a la parte real del número complejo
- (void) setReal: (float) Re{
    partReal = Re;
}

// Asigna un valor a la parte imaginaria del número complejo
- (void) setImaginaria: (float) Im{
    partImaginaria = Im;
}

// Devuelve la parte real del número complejo
- (float) real{
    return partReal;
}

// Devuelve la parte imaginaria del número complejo
- (float) imaginaria{
    return partImaginaria;
}

@end

Como ves la implentación (que puede hacer) de la clase comienza por @implentation i acaba por @end. En medio las definiciones de cada uno de los métodos que permiten acceder a los datos de la clase.

Utilizando la clase

Ahora para utilizar la clase que hemos definido antes hay que crear un objeto (en muchas partes les llaman instancias, sic) de la clase. Para ello hay que escribir lo siguiente:

    id *num1; num1 = [Complejo alloc];
    num1 = [num1 init];

Si hasta ahora el código era muy parecido al lenguaje C, pero comenzamos a ver diferencias importantes. La primera linea define un puntero a una variable de tipo id. Desde luego aquí no es sitio para explicar los punteros, así que tendrás que buscar un explicación más amplia en otro sitio. las variables tipo id son un añadido del Objective-C, no existen en C. Indican que estamos apuntando a un objeto pero todavía no se ha decidido que tipo de objeto será. Esto permite una mayor flexibilidad al lenguaje, ya que si nos interesa podrá decidirse que tipo de objeto será en el momento de ejecutar el programa.

La segunda linea reservamos espacio en la memoria para guardar el objeto num1. Lo hacemos enviando el mensaje alloc a la clase Complejo. Los paréntesis cuadrados son los que nos indican que estamos enviando un mensaje. Si recuerdas la definición de la clase Complejo que hicimos antes no había ningún método llamado alloc, ¿Que pasa? púes que una de la propiedades de la programación orientada a objetos actúa: la herencia. En Cocoa todos los objetos descienden de una clase llamada NSObject, y todos los métodos definidos en esta clase se pueden utilizar en las clases descendientes. Un ejemplo son los métodos alloc, init y release.

Finalmente, en la tercera linea, inicializamos el objeto que hemos creado antes.

Existe una forma de escribir lo anterior de una forma mucho más compacta:

     Complejo *num1 = [[Complejo alloc] init];

Una vez creado el objeto podemos utilizarlo enviando mensajes y recogiendo el resultado del mensaje que nos devuelve el objeto:

        // Creamos el número con el que vamos a trabajar,
        // todavía sin nada dentro.
    Complejo *num1 = [[Complejo alloc] init];
	// Damos valores al número complejo
    [num1 setReal:4.3];
    [num1 setImaginaria:3.0];
        // Imprimimos el número complejo y información
        // complentaria
    NSLog(@"La fraccion es: %@\n", [num1 print]);
       // Liberamos la memoria que ocupaba el número
       [num1 release];

Y eso es casi todo. En los anexos está todo el proyecto en formato XCode para poder probarlo y una explicación ampliada sobre como hacer este pequeño ejemple desde cero utilizando Xcode.

Anexos

Código fuente del ejemplo

Cómo crear el ejemplo con Xcode

Barcelona, diciembre 2007. Luis Rey

Etiquetas: , ,

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s


A %d blogueros les gusta esto: