7.2. Arrays de objetos
Curso: Programación en C# (2015), por Nacho Cabanes
7.2. Arrays de objetos
Es muy frecuente que no nos baste con tener un único objeto de una clase, sino que necesitemos manipular varios objetos pertenecientes a la misma clase. En ese caso, podemos almacenar todos ellos en un "array".
Deberemos usar "new" dos veces: primero para reservar memoria para el array, y luego para cada uno de los elementos. Por ejemplo, podríamos partir del ejemplo del apartado 6.8 y crear un array de 5 perros así:
Perro[] misPerros = new Perro[5]; for (byte i = 0; i < 5; i ++) misPerros[i] = new Perro();
Un fuente completo de ejemplo podría ser
// Ejemplo_07_02a.cs // Array de objetos // Introducción a C#, por Nacho Cabanes using System; public class Ejemplo_07_02a { public static void Main() { Perro[] misPerros = new Perro[5]; for (byte i = 0; i < 5; i ++) misPerros[i] = new Perro(); } } // ------------------ public class Animal { public Animal() { Console.WriteLine("Ha nacido un animal"); } } // ------------------ public class Perro: Animal { public Perro() { Console.WriteLine("Ha nacido un perro"); } }
y su salida en pantalla, que recuerda a la del apartado 6.8, sería
Ha nacido un animal Ha nacido un perro Ha nacido un animal Ha nacido un perro Ha nacido un animal Ha nacido un perro Ha nacido un animal Ha nacido un perro Ha nacido un animal Ha nacido un perro
Ejercicios propuestos:
Ejercicio propuesto 7.2.1: Crea una versión ampliada del ejercicio 6.8.1 (clase Trabajador y relacionadas), en la que no se cree un único objeto de cada clase, sino un array de tres objetos.
Ejercicio propuesto 7.2.2: Amplía el proyecto Libro (ejercicio 6.7.2), de modo que permita guardar hasta 1.000 libros. Main mostrará un menú que permita añadir un nuevo libro o ver los datos de los ya existentes.
Ejercicio propuesto 7.2.3: Amplía el esqueleto del ConsoleInvaders (6.7.3), para que haya 10 enemigos en una misma fila (todos compartirán una misma coordenada Y, pero tendrán distinta coordenada X). Necesitarás un nuevo constructor en la clase Enemigo, que reciba los parámetros X e Y.
Además, existe una peculiaridad curiosa: podemos crear un array de "Animales", que realmente contenga objetos de distintas subclases (en este caso, unos de ellos serán perros, otros gatos, etc.),
Animal[] misAnimales = new Animal[3]; misAnimales[0] = new Perro(); misAnimales[1] = new Gato(); misAnimales[2] = new GatoSiames();
Un ejemplo más detallado:
// Ejemplo_07_02b.cs // Array de objetos de distintas clases // Introducción a C#, por Nacho Cabanes using System; public class Ejemplo_07_02b { public static void Main() { Animal[] misAnimales = new Animal[8]; misAnimales[0] = new Perro(); misAnimales[1] = new Gato(); misAnimales[2] = new GatoSiames(); for (byte i=3; i<7; i++) misAnimales[i] = new Perro(); misAnimales[7] = new Animal(); } } // ------------------ public class Animal { public Animal() { Console.WriteLine(); Console.WriteLine("Ha nacido un animal"); } } // ------------------ public class Perro: Animal { public Perro() { Console.WriteLine("Ha nacido un perro"); } } // ------------------ public class Gato: Animal { public Gato() { Console.WriteLine("Ha nacido un gato"); } } // ------------------ public class GatoSiames: Gato { public GatoSiames() { Console.WriteLine("Ha nacido un gato siamés"); } }
La salida de este programa sería:
Ha nacido un animal Ha nacido un perro Ha nacido un animal Ha nacido un gato Ha nacido un animal Ha nacido un gato Ha nacido un gato siamés Ha nacido un animal Ha nacido un perro Ha nacido un animal Ha nacido un perro Ha nacido un animal Ha nacido un perro Ha nacido un animal Ha nacido un perro Ha nacido un animal
Si los objetos tienen otros métodos, no sólo el constructor, no todo funcionará a la primera. Pronto veremos los posibles problemas y la forma de solucionarlos.
Ejercicios propuestos:
Ejercicio propuesto 7.2.4: A partir del ejemplo 07.02b y del ejercicio 6.8.1 (clase Trabajador y relacionadas), crea un array de trabajadores en el que no sean todos de la misma clase.
Ejercicio propuesto 7.2.5: Amplía el proyecto Libro (ejercicio 7.2.2), de modo que permita guardar 1000 documentos de cualquier tipo. A la hora de añadir un documento, se preguntará al usuario si desea guardar un documento genérico o un libro, para usar el constructor adecuado.
Ejercicio propuesto 7.2.6: Amplía el esqueleto del ConsoleInvaders (7.2.3), para que haya tres tipos de enemigos, y un array que contenga 3x10 enemigos (3 filas, cada una con 10 enemigos de un mismo tipo, pero distinto del tipo de los elementos de las otras filas). Cada tipo de enemigos será una subclase de Enemigo, que se distinguirá por usar una "imagen" diferente. Puedes usar la "imagen" que quieras (siempre que sea un string de letras, como "}{" o "XX"). Si estas imágenes no se muestran correctamente en pantalla al lanzar una partida, no te preocupes, lo solucionaremos en el siguiente apartado.
Actualizado el: 08-04-2015 00:35