Saltar a contenido

U5.1 · Clases abstractas, interfaces y herencia

Relación de ejercicios de herencia, polimorfismo, clases abstractas e interfaces.

Ejercicio 5.1

Figuras geométricas. Crea una clase abstracta Figura con color y los métodos abstractos area() y perimetro(). Implementa Circulo, Rectangulo y Triangulo. Usa la constante π de tu lenguaje. Objetivo: clases abstractas y polimorfismo.

Solución modelo (bloqueada)

🔒 La solución completa está bloqueada. Esto es solo un ejemplo de cómo empieza:

import 'dart:math';
abstract class Figura {
  final String color;
  Figura(this.color);
  double area();
// ... (resto de la solución bloqueado)

Ejercicio 5.2

Empleados y departamentos. Crea una clase abstracta Empleado con nombre, id y el método abstracto calculaSalario(). Crea EmpleadoPorHora (horas trabajadas al mes y tarifa por hora) y EmpleadoFijo (salario fijo anual y número de pagas), que calculan el salario mensual de forma distinta. Crea Departamento con una lista de empleados, agregarEmpleado y calculaSalarioTotal.

En main agrega varios empleados y muestra, por cada uno: Nombre con ID-0001 tiene un salario de 28697.96 al mes. (id con 4 cifras y salario con 2 decimales). ¿Qué restricciones lógicas pondrías a las propiedades?

Ejercicio 5.3

Dispositivos electrónicos. Crea las interfaces EncendidoApagado (encender(), apagar()), DispositivoElectronico (reiniciar()) y Vehiculo (propiedades motorEncendido y kmHora; métodos acelerar(Int) y frenar(Int)). Impleméntalas en Telefono, Lavadora y Coche, cada una con los métodos que tengan sentido.

Un coche está apagado por defecto y solo acelera y frena con el motor encendido. Si al frenar kmHora fuera negativo, queda en 0.

Ejercicio 5.4

Notificaciones. Diseña una interfaz Notificable con el método enviarNotificacion() e impleméntala en CorreoElectronico, MensajeTexto y NotificacionPush, simulando cada canal. En main crea una lista de tipo Notificable con un objeto de cada clase y recórrela enviando las notificaciones. Objetivo: tratar de forma uniforme clases distintas y poder añadir nuevos canales sin tocar el código que los usa.

Solución modelo (bloqueada)

🔒 La solución completa está bloqueada. Esto es solo un ejemplo de cómo empieza:

abstract interface class Notificable {
  void enviarNotificacion();
}
class CorreoElectronico implements Notificable {
  @override
// ... (resto de la solución bloqueado)

Ejercicio 5.5

Biblioteca. Parte 1: define clases de datos (solo almacenan información) Libro(titulo, autor, anio), Revista(titulo, issue, anio) y DVD(titulo, director, anio). Parte 2: modela los usuarios con una jerarquía cerrada (sealed class en Kotlin, sealed interface en Java y Dart; en Python, una clase base con subclases): Estudiante(id, nombre, carrera), Profesor(id, nombre, departamento) y Visitante(id, nombre).

Escribe una función que reciba un usuario y un libro y devuelva un mensaje indicando si puede tomarlo prestado (los visitantes no pueden; los profesores tienen préstamos más largos).

Ejercicio 5.6

Artículos. Crea Articulo con nombre y precio (modificables) y un id automático mediante un contador (totalArticulos) y una función generarId(); el id no se puede modificar ni consultar desde fuera. promocionNavidad(porcentaje) rebaja el precio. toString: {nombre} - {precio con dos decimales}€ (ID: {id}).

Crea Ordenador, que hereda de Articulo y añade un tipo (BASICO, OFIMATICA, TODOTERRENO, GAMING; por defecto BASICO). Sobrescribe promocionNavidad para que solo se aplique si el precio supera 500 €.

En main: dos artículos de 25 y 45 €, un ordenador GAMING de 1299.99 € y uno básico de 399.99 €. Guárdalos en una lista, aplica la promoción e imprime. Responde: ¿de qué tipo infiere el compilador la lista? ¿Qué polimorfismo ocurre? ¿Qué pasaría con una lista de Ordenador o de Object/Any?

Ejercicio 5.7

Vehículos. Clase base Vehiculo con marca, modelo y capacidad de combustible (litros), el método mostrarInformacion() y calcularAutonomia() (10 km por litro). Automovil (tipo: sedán, SUV...) calcula 100 km más que la base; Motocicleta (cilindrada) 40 km menos.

Ejercicio 5.8

Persona y Estudiante, paso a paso.

  1. Clase Persona con nombre y edad; crea un objeto y muéstralo.
  2. Método cumple() que suma 1 a la edad; toString: Persona (nombre = Lucía, edad = 21).
  3. Encapsulamiento: la edad no se puede modificar desde fuera, solo con cumple().
  4. Herencia: Estudiante hereda de Persona y añade carrera; toString reutiliza el del padre.
  5. Polimorfismo: método actividad() en Persona ("Lucía está realizando una actividad.") sobrescrito en Estudiante.
  6. Validación: no se aceptan nombres vacíos ni edades negativas; la edad tiene un valor por defecto. Prueba un estudiante con edad negativa capturando la excepción.

Ejercicio 5.9

Gestión académica. Clase base Persona (nombre, edad, id) con mostrarRol(). Estudiante (curso, calificación promedio) implementa mostrarRol() y mostrarCalificacion(). Profesor (departamento, años de experiencia) implementa mostrarRol() y mostrarExperiencia().

Ejercicio 5.10

Personal de una empresa.

  • Persona (nombre, edad): toString (Nombre: Julia, Edad: 24) y celebrarCumple() (suma 1 y devuelve Feliz cumpleaños Julia! Ahora tienes 25 años.).
  • Empleado (hereda de Persona): salarioBase y porcentajeImpuestos (10.0 por defecto); admite construirse también con enteros. calcularSalario() aplica los impuestos; toString añade el salario con 2 decimales; trabajar().
  • Gerente (hereda de Empleado): bonus y exentoImpuestos (falso por defecto); su porcentaje de impuestos es siempre 33.99. calcularSalario() = salario base con impuestos + bonus, o sin impuestos si está exento; administrar().

En main crea una persona, un empleado y un gerente y prueba los métodos de cada uno.