U6.1 · Jerarquía de clases¶
Herencia, clases abstractas, interfaces, modificadores y constructores. La base es una biblioteca de medios: Articulo (abstracta) con Libro, Revista y DVD, una interfaz Buscable y una clase BibliotecaDigital.
Ejercicio 6.1¶
Biblioteca de medios. Crea la jerarquía:
Articulo(abstracta): título, autor y un método abstractodescripcion().Libro(páginas),Revista(número) yDVD(duración en minutos), cada una con sudescripcion().- Interfaz
BuscableconbuscarPorTitulo(titulo)ylistarPorCategoria(categoria). BibliotecaDigital: guarda una colección de artículos e implementaBuscable.
En main crea varios artículos, búscalos por título y muestra su descripción.
Ejercicio 6.2¶
Actividad: préstamos. Amplía la biblioteca del ejercicio 6.1:
- Añade a
Articulouna propiedaddisponible(verdadera por defecto). - Implementa
prestarArticulo(titulo)ydevolverArticulo(titulo)enBibliotecaDigital. - Controla los casos erróneos con excepciones propias o mensajes claros: el artículo no existe, ya está prestado (al prestar) o ya estaba disponible (al devolver).
- En
maindemuestra todos los casos: un préstamo correcto, un préstamo repetido, una devolución correcta y una devolución repetida.
Intenta resolverla antes de mirar la solución.
Solución modelo (bloqueada)
🔒 La solución completa está bloqueada. Esto es solo un ejemplo de cómo empieza:
var biblio = new BibliotecaDigital(new List<Articulo> { new Libro("1984", "Orwell", 328), new Dvd("Matrix", "Wachowski", 136) });
Intentar(() => biblio.PrestarArticulo("1984")); // correcto
Intentar(() => biblio.PrestarArticulo("1984")); // ya prestado
Intentar(() => biblio.DevolverArticulo("1984")); // correcto
Intentar(() => biblio.DevolverArticulo("1984")); // ya disponible
// ... (resto de la solución bloqueado)Ejercicio 6.3¶
Orden de los constructores. Crea tres clases encadenadas A → B → C (cada una hereda de la anterior). En cada constructor (y en los bloques de inicialización, si tu lenguaje los tiene) imprime un mensaje con el nombre de la clase. Antes de ejecutar, escribe en papel qué saldrá al hacer C(). Después comprueba y explica el orden. Repite con un constructor que reciba un parámetro y lo pase a la clase padre.
En C#
En C# el orden es: primero los inicializadores de campo de la clase hija, después el constructor de la base y al final el cuerpo del constructor de la hija. Con : this(...) se ejecuta primero el constructor al que se encadena. Pon un Console.WriteLine en cada uno para verlo.
Ejercicio 6.4¶
Controlar la herencia. Crea una clase base con un método que sí se pueda sobrescribir y otro que no; y una clase que no se pueda heredar. Intenta, en cada caso, hacer lo prohibido y copia y explica el error del compilador (o del intérprete). Después añade una clase abstracta y comprueba qué ocurre al intentar instanciarla.
En C#
En C# las clases se pueden heredar por defecto: usa sealed para impedirlo, virtual, abstract, override y sealed override para los métodos.
Ejercicio 6.5¶
Sobrescritura. Parte de una clase Animal con un método hacerSonido(). Crea Perro, Gato y Pajaro que lo sobrescriban. Añade un método presentarse() en Animal que reutilice hacerSonido() (el comportamiento cambia según el objeto real). Recorre una lista mixta y explica por qué se ejecuta el método de la subclase.