Tema 6 • Ejercicios del Tema

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 Animal con el método void 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 ejecuta hacerSonido().
  • Parte 4 – Herencia (ampliación media): Crea una clase abstracta AnimalBase que implemente Animal, contenga el atributo nombre y 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 Volador con el método volar(). Crea la clase Pajaro que implemente tanto Animal como Volador. En el Main, detecta si un animal vuela usando instanceof.
---

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("--------------------");
        }
    }
}