05 – ¿Quién construye los objetos? Quién va a ser, ¡el Constructor!

Hasta ahora, hemos creado usando el entorno Greenfoot los objetos que nos interesaban en nuestro mundo y hemos programado el comportamiento, mediante la programación de sus métodos de clase.

Pero, la pregunta es, ¿existe un reflejo en código java de esas acciones que hacemos para crear nuestros objetos? La respuesta es, evidentemente, sí.

Debemos darnos cuenta que nuestros objetos viven en un mundo determinado, que no es sino otro objeto. Un objeto que es especial, eso sí, pues es un objeto que contiene a otros.

Para ver cómo funciona este objeto, vamos a partir del proyecto del mundo Tortuga original y crearemos las clases Lechuga y Serpiente como en los proyectos anteriores. Una vez hayamos hecho esto, vamos a crear un objeto tortuga, una serpiente, y dos lechugas en el mundo y, tras hacerlo, guardaremos el mundo con la opción Save the World del menú contextual sobre el escenario.

Si accedemos al código fuente de la clase mundo tortuga (TurtleWorld), observamos que se ha añadido un método, prepare(), cuyo código fuente tiene las instrucciones que detallamos en las imágenes a continuación.

constructores

constructores2

Vemos cómo se crea un nuevo objeto tortuga invocando al constructor de la clase Tortuga con la sentencia

new Turtle()

y creamos una variable-referencia a dicho objeto, para poder referirnos al mismo en nuestro código fuente.

Lo mismos sucede con el resto de objetos (se crean dos lechugas con new Lechuga() y una serpiente con una instrucción new Serpiente()). Además, dichos objetos se añaden al mundo mediante el método addObjetc(Object) de la clase World.

A los métodos Turtle(), Lechuga() y Serpiente() que se invocan con la instrucción new se les llama constructores de la clase correspondiente y son los encargados de crear los objetos de esa clase cuando son invocados.

Si accedemos al código fuente de cualquiera de esas clase veremos que esos métodos no aparecen por ningún lado. El motivo es porque una Tortuga, Lechuga o Serpiente no se crea de manera distinta a los Actores que se crearían en el mundo con el constructor de la clase Actor y, por eso, cuando invocamos al constructor correspondiente, realmente se usa, por herencia, el constructor de la clase Actor, clase padre de todas.

Sin embargo, ¿y si quisiésemos que las serpientes naciesen con un giro aleatorio predeterminado? Es decir, queremos que cada serpiente, al ser creada, se cree para que dicha serpiente gire en el borde del mundo con un giro de ángulo aleatorio y distinto de otras.

Deberíamos entonces crear en la clase serpiente su constructor, con el código que muestro a continuación.

serpiente_cons

El atributo giro almacenará el giro con el que girará siempre esa serpiente. El método siguiente es el constructor, al que hay que pasarle como argumento el ángulo de giro.

Observemos que los constructores son métodos especiales:

  • son públicos, para que todos puedan usarlos.
  • no se espera que devuelvan ningún valor, por lo que ni siquiera tienen la palabra reservada void.
  • su nombre debe ser el mismo de la clase, Serpiente en este caso.

¿Cómo creamos ahora una serpiente en nuestro mundo? Vamos a hacerlo por código, sin más que escribir en el método prepare() de nuestro mundo el siguiente código fuente.

crea-serpiente

Hemos usado un bucle for de Java (para conocer la sintaxis de la instrucción for, seguir el enlace) para crear tres objetos Serpiente que girarán, cada uno, con un ángulo de giro distinto aleatorio.

Si programamos ahora el comportamiento de las tortugas y las serpientes igual que hemos hecho en actividades anteriores, veremos como todo funciona y las serpientes giran, cada una, con ángulos distintos al llegar al borde.

¡Adelante, inténtalo, es tu turno!

Anuncios

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