Ejercicio 2: Sistema de animales
Enunciado
Actividad: Sistema de animales (polimorfismo + interfaces + colecciones)
Contexto
Se quiere desarrollar un pequeño sistema que gestione distintos tipos de animales en una granja/zoológico. Todos los animales deben poder emitir un sonido, pero cada uno lo hará de forma diferente.
- Parte 1 – Interfaz (obligatoria): Define la interfaz
Animalcon el métodovoid hacerSonido();. - Parte 2 – Implementaciones (obligatoria): Crea al menos 3 clases (Perro, Gato, Vaca) que implementen la interfaz y muestren un sonido distinto.
- Parte 3 – Uso de polimorfismo (obligatoria): En el Main, crea un ArrayList de tipo
Animal, añade distintos animales, recórrelo y ejecutahacerSonido(). - Parte 4 – Herencia (ampliación media): Crea una clase abstracta
AnimalBaseque implementeAnimal, contenga el atributonombrey un método para mostrarlo. Modifica las clases para que extiendan de ella. - Parte 5 – Método adicional (ampliación media): Añade a la interfaz el método
void comer();e impleméntalo en cada clase. - Parte 6 – Comportamiento adicional (ampliación avanzada): En el Main, haz que cada animal muestre su nombre, coma y haga su sonido.
- Parte 7 – Reto (ampliación alta): Crea una interfaz
Voladorcon el métodovolar(). Crea la clasePajaroque implemente tantoAnimalcomoVolador. En el Main, detecta si un animal vuela usandoinstanceof.
Solución Completa
A continuación se presenta la solución integrando todas las partes y ampliaciones requeridas, organizadas lógicamente desde las interfaces hasta el programa principal.
1. Interfaces
Definimos los contratos que deberán cumplir nuestras clases.
package Tema6.Ejercicios.ejercicio2;
public interface Animal {
void hacerSonido();
void comer();
}
package Tema6.Ejercicios.ejercicio2;
public interface Volador {
void volar();
}
2. Clase Abstracta
Esta clase provee la base común (el nombre) para todos los animales, evitando repetir código en cada subclase.
package Tema6.Ejercicios.ejercicio2;
public abstract class AnimalBase implements Animal {
protected String nombre;
public AnimalBase(String nombre) {
this.nombre = nombre;
}
public void mostrarNombre() {
System.out.println("Nombre: " + nombre);
}
}
3. Clases de Animales
Cada clase concreta hereda de AnimalBase y define su propio comportamiento al comer y hacer sonido. El pájaro, además, implementa la interfaz Volador.
package Tema6.Ejercicios.ejercicio2;
public class Perro extends AnimalBase implements Animal {
public Perro(String nombre) {
super(nombre);
}
@Override
public void hacerSonido() {
System.out.println("El perro hace guau");
}
@Override
public void comer() {
System.out.println("El perro esta comiendo");
}
}
package Tema6.Ejercicios.ejercicio2;
public class Gato extends AnimalBase implements Animal {
public Gato(String nombre) {
super(nombre);
}
@Override
public void hacerSonido() {
System.out.println("El gato hace miau");
}
@Override
public void comer() {
System.out.println("El gato esta comiendo");
}
}
package Tema6.Ejercicios.ejercicio2;
public class Vaca extends AnimalBase implements Animal {
public Vaca(String nombre) {
super(nombre);
}
@Override
public void hacerSonido() {
System.out.println("La vaca hace muuu");
}
@Override
public void comer() {
System.out.println("La vaca esta comiendo");
}
}
package Tema6.Ejercicios.ejercicio2;
public class Pajaro extends AnimalBase implements Volador {
public Pajaro(String nombre) {
super(nombre);
}
@Override
public void hacerSonido() {
System.out.println("El pajaro hace pío pío");
}
@Override
public void comer() {
System.out.println("El pajaro esta comiendo");
}
@Override
public void volar() {
System.out.println("Pajaro volando");
}
}
4. Clase Principal (Main)
Aquí combinamos el uso de colecciones y polimorfismo. Recorremos todos los animales de forma genérica y comprobamos capacidades específicas mediante instanceof.
package Tema6.Ejercicios.ejercicio2;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList animales = new ArrayList<>();
animales.add(new Perro("Perro1"));
animales.add(new Gato("Gato1"));
animales.add(new Vaca("Vaca1"));
animales.add(new Pajaro("Pajaro1"));
for (AnimalBase a : animales) {
a.mostrarNombre();
a.hacerSonido();
a.comer();
// Reto: Comprobación de la interfaz Volador
if (a instanceof Volador) {
((Volador) a).volar();
}
System.out.println("--------------------");
}
}
}