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 java.util.List;
public class Solucion {
static abstract class Figura {
protected final String color;
Figura(String color) {
// ... (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:
import java.util.List;
public class Solucion {
interface Notificable {
void enviarNotificacion();
}
// ... (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.
- Clase
Personacon nombre y edad; crea un objeto y muéstralo. - Método
cumple()que suma 1 a la edad;toString:Persona (nombre = Lucía, edad = 21). - Encapsulamiento: la edad no se puede modificar desde fuera, solo con
cumple(). - Herencia:
Estudiantehereda dePersonay añadecarrera;toStringreutiliza el del padre. - Polimorfismo: método
actividad()enPersona("Lucía está realizando una actividad.") sobrescrito enEstudiante. - 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) ycelebrarCumple()(suma 1 y devuelveFeliz cumpleaños Julia! Ahora tienes 25 años.).Empleado(hereda dePersona):salarioBaseyporcentajeImpuestos(10.0 por defecto); admite construirse también con enteros.calcularSalario()aplica los impuestos;toStringañade el salario con 2 decimales;trabajar().Gerente(hereda deEmpleado):bonusyexentoImpuestos(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.