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:
abstract class Articulo(val titulo: String, val autor: String, var disponible: Boolean = true) {
abstract fun descripcion()
fun estado() = if (disponible) "disponible" else "prestado"
}
class Libro(titulo: String, autor: String, val paginas: Int) : Articulo(titulo, autor) {
// ... (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 Kotlin
Puedes usar bloques init { ... } y observar su orden respecto a los constructores secundarios.
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 Kotlin
En Kotlin todo es final por defecto: usa open, abstract, final override y sealed.
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.