Índice

Ejercicios Unidad 15 - Herencia

Descargar estos ejercicios

Antes de empezar

Para realizar estos ejercicios, deberás descargar los recursos del enlace de proyecto_poo_roles_herencia. Como puedes ver, la solución está compuesta de varios proyectos. Cada uno de ellos corresponde con un ejercicio, deberás implementar todo el código, tanto de la Main como de los métodos que se piden en cada ejercicio. Cada proyecto contiene el test correspondiente, que deberás pasar para comprobar que has hecho el ejercicio correctamente.

Ejercicio 1. Herencia con herramientas de carpintería

Implementa un sistema de herramientas de carpintería donde tengas una clase base Herramienta y una clase derivada Taladro. La clase hija debe sobrescribir tanto una propiedad como un método de la clase padre. Para este y el resto de ejercicios, si es posible usar las propiedades autoimplementadas, serán las que elegiremos para que el código quede más compacto.

Ejercicio 1: Sistema de herramientas de carpintería

Creando herramientas ....

Martillo, Marca: Stanley, Peso: 0.5, Precio: 25

// para un precio sin rebajar de 105.00
Taladro Percutor, Marca: Bosch, Peso: 2.3, Precio: 89.25, Potencia: 750, Velocidad Máxima: 3000 

Presiona cualquier tecla para salir...

«Entity»Herramienta-id: Guid-nombre: string-marca: string-peso: double-precioBase: double+Herramienta(nombre: string, marca: string, peso: double, precioBase: double)+GetId(): Guid+GetNombre(): string+GetMarca(): string+GetPeso(): double+{virtual} GetPrecio(): double+{virtual} ACadena(): stringTaladro-potencia: int {readonly}-velocidadMaxima: int {readonly}+Taladro(nombre: string, marca: string, peso: double, precioBase: double, potencia: int, velocidadMaxima: int)+GetPotencia(): int+GetVelocidadMaxima(): int+^/GetPrecio(): double+^Acadena(): stringhereda de

Requisitos:

Ejercicio 2. Herencia con locales y cines

Implementa un sistema de gestión de locales, locales comerciales y cines utilizando herencia. La clase LocalComercial heredará de Local, y la clase Cine heredará de LocalComercial. Deberás sobrescribir el método ACadena en cada nivel de la jerarquía para mostrar la información completa de cada tipo de entidad.

Ejercicio 2: Sistema de gestión de cines

=== Creando y mostrando cines ===

--- Cine 1 ---
Local:
  Ciudad: Alicante
  Calle: Calle de las Setas
  Número de plantas: 1
  Dimensiones: 500 m²
Local Comercial:
  Razón Social: Cinesa
  Número de Licencia: 12345
Cine:
  Aforo de la sala: 200 personas

--- Cine 2 ---
Local:
  Ciudad: Madrid
  Calle: Gran Vía
  Número de plantas: 3
  Dimensiones: 1200 m²
Local Comercial:
  Razón Social: Yelmo Cines
  Número de Licencia: 67890
Cine:
  Aforo de la sala: 350 personas

--- Cine 3 ---
Local:
  Ciudad: Valencia
  Calle: Plaza del Ayuntamiento
  Número de plantas: 2
  Dimensiones: 800 m²
Local Comercial:
  Razón Social: Kinépolis
  Número de Licencia: 54321
Cine:
  Aforo de la sala: 450 personas

Presiona cualquier tecla para salir...

Requisitos:

Ejercicio 3. Herencia con Personajes de un juego

Implementa un sistema de personajes para un juego de rol. Tendrás una clase base Personaje y dos clases derivadas, Guerrero y Mago. Deberás usar herencia, propiedades protegidas, propiedades calculadas y métodos virtuales. Además, la clase base se relacionará con un record para definir una habilidad especial.

Ejercicio 3: Sistema de Personajes

=== Creando un Guerrero ===
Guerrero creado: Personaje: Conan, Nivel: 10, Energía: 100
  Habilidades:
    * Furia (Daño: 50)
    * Golpe Giratorio (Daño: 30)
  Fuerza: 20

=== Creando un Mago ===
Mago creado: Personaje: Gandalf, Nivel: 12, Energía: 120
  Habilidades:
    * Rayo (Daño: 40)
    * Bola de Fuego (Daño: 70)
    * Escarcha (Daño: 25)
  Maná: 50

Mago con nueva habilidad añadida: Personaje: Gandalf, Nivel: 12, Energía: 120
  Habilidades:
    * Rayo (Daño: 40)
    * Bola de Fuego (Daño: 70)
    * Escarcha (Daño: 25)
    * Telequinesis (Daño: 10)
  Maná: 50

=== Acciones de los personajes ===
--- Guerrero ---
Conan ataca con Furia! (fuerza 20 + mitad habilidades = 60)

--- Mago ---
Gandalf ataca con Bola de Fuego! lanza Rayo con fuerza 40 y se apoya con: (maná 50 + total habilidades = 195)

Presiona cualquier tecla para salir...

«Entity»Personaje#energia: int-habilidades: List<Habilidad>-nivel: int+Personaje(nombre: string, energia: int, habilidad: Habilidad)+GetNombre(): string+AñadeHabilidad(habilidad:Habilidad): void+{virtual} Ataca(): string+{virtual} ACadena(): stringGuerrero-fuerza: int+GetNivel(): int+Guerrero(nombre: string, energia: int, habilidad: Habilidad, fuerza: int)+GetFuerza(): int+^Ataca(): string+^ACadena(): stringMago-mana: int+Mago(nombre: string, energia: int, habilidad: Habilidad, mana: int)+GetMana(): int+^Ataca(): string+^ACadena(): string«Record»Habilidad+Nombre: string+Daño: inthabilidades0..*

Requisitos:

Ejercicio 4. Polimorfismo de datos con herramientas avanzadas

Extiende el sistema de herramientas del Ejercicio 1 añadiendo nuevas subclases y un nuevo método virtual común que permita demostrar el polimorfismo de datos.

Ejercicio 4: Polimorfismo con herramientas

Creando inventario...

Martillo, Marca: Stanley, Peso: 0,5, Precio: 25
Taladro Percutor, Marca: Bosch, Peso: 2,3, Precio: 89,25, Potencia: 750, Velocidad Máxima: 3000
Sierra Circular, Marca: Makita, Peso: 4,1, Precio: 132, Potencia: 1400, Hoja: 185mm
Lijadora Orbital, Marca: Dewalt, Peso: 1,8, Precio: 54, RPM: 9000, Disco: 125mm

Mostrando usos...
Martillo: Depende de la herramienta.
Taladro Percutor: Perfora materiales duros a alta velocidad.
Sierra Circular: Realiza cortes rectos en madera y tableros.
Lijadora Orbital: Lija y suaviza superficies de madera.

Accediendo a métodos específicos:

Taladro Percutor => Perforar 8mm diámetro, 60mm profundidad OK
Sierra Circular => Cortar("Madera", 18mm) OK
Lijadora Orbital => Pulir(2.5 m2) tarda 2fs

Presiona cualquier tecla para salir...

Requisitos:

Ejercicio 5. Red de albergues de viaje

Implementa un sistema simplificado de gestión de una pequeña red de albergues de viaje. Se desea almacenar distintos tipos de albergues y calcular de forma polimórfica si admiten una reserva y el precio final por noche según su tipo, temporada y ocupación.

Ejercicio 5: Red de albergues (versión interactiva)

--- MENÚ GESTIÓN ALBERGUES ---
[1] Añadir albergue
[2] Registrar reserva
[3] Mostrar estado
[4] Mostrar información complementaria
[ESC] Salir
Seleccione opción: 3

=== ESTADO ACTUAL ===
Montaña Verde (AlbergueRural) - Capacidad: 40, Ocupación: 8%, Servicios: [Desayuno, Cena, Rutas]
 Precio base: 22 ,Precio actual: 25,3
City Hostel (AlbergueUrbano) - Capacidad: 80, Ocupación: 6%, Servicios: [WiFi, Lavandería]
 Precio base: 18 ,Precio actual: 18
Surf Point (AlbergueCostero) - Capacidad: 55, Ocupación: 18%, Servicios: [Clases de surf, Parking]
 Precio base: 20 ,Precio actual: 20

Pulse una tecla para continuar...
--- MENÚ GESTIÓN ALBERGUES ---
{se omite el menú por simplificación}
Seleccione opción: 2
Listado de albergues:
 (0) Montaña Verde
 (1) City Hostel
 (2) Surf Point
Elija índice: 0
Plazas a reservar: 8
¿Temporada alta? (S/N): S
[Reserva] Montaña Verde: 8 plazas (ALTA) => ACEPTADA. Ocupación ahora 11/40 (27%)

--- MENÚ GESTIÓN ALBERGUES ---
{se omite el menú por simplificación}
Seleccione opción: 4
Información complementaria:
Montaña Verde => Clima previsto: Nieve ligera
City Hostel => Sin información complementaria
Surf Point => Oleaje estimado: Moderado

--- MENÚ GESTIÓN ALBERGUES ---
{se omite el menú por simplificación}
Seleccione opción: ESC
Saliendo del gestor...

Descripción general:
Se parte de una clase base Albergue y tres subclases: AlbergueRural, AlbergueUrbano y AlbergueCostero. Todas comparten la capacidad, reservas y cálculo del porcentaje de ocupación; cada una aplica reglas distintas para aceptar reservas y ajustar el precio final por noche.

Entidades de tipo Value Object:

Clase base Albergue:

Reglas específicas:

  1. AlbergueRural:
    • Precio: si temporada alta en alguna reserva (existe alguna EsTemporadaAlta) y ocupación >= 20% => Precio * 2.15 si no Precio * 1.15 ya aplicado por incluir desayuno y cena.
    • AdmiteReserva: además de la base, rechaza peticiones > 50% de la capacidad total en una sola reserva.
    • InformacionComplementaria devuelve un texto de clima simulado.
  2. AlbergueUrbano:
    • Precio: si ocupación >= 60% => Precio * 1.10 si no Precio.
    • AdmiteReserva: permite reservas grandes mientras queden plazas (no añade restricciones extra).
  3. AlbergueCostero:
    • Precio: si es temporada alta en la última reserva registrada => Precio + 3 y si ocupación >= 40% añade +2 extra.
    • AdmiteReserva: rechaza si temporada ALTA y plazas solicitadas > 60% de la capacidad restante.
    • InformacionComplementaria devuelve un texto sobre el oleaje.

Programa principal: