10. Interfaces y Polimorfismo
Interfaces
Definen un contrato que las clases deben implementar:
interface.kt
KOTLIN
1 interface Navegable {
2 fun haciaAdelante()
3 fun haciaAtras() {
4 println("Volviendo atrás")
5 }
6 }
7
8 class Browser : Navegable {
9 override fun haciaAdelante() {
10 println("Navegando adelante")
11 }
12 // haciaAtras() usa la implementación por defecto
13 }
Abstract classes
Similar a interfaces pero pueden tener estado (propiedades con valor):
abstract.kt
KOTLIN
1 abstract class Forma(val nombre: String) {
2 abstract fun area(): Double
3 fun describir() = "Soy $nombre con área ${area()}"
4 }
5
6 class Circulo(val radio: Double) : Forma("Círculo") {
7 override fun area() = Math.PI * radio * radio
8 }
9
10 class Rectangulo(val ancho: Double, val alto: Double) : Forma("Rectángulo") {
11 override fun area() = ancho * alto
12 }
Sealed class
Jerarquía de tipos restringida al mismo archivo. Perfecta para estados:
sealed.kt
KOTLIN
1 sealed class Estado {
2 object Cargando : Estado()
3 data class Exito(val datos: String) : Estado()
4 data class Error(val mensaje: String) : Estado()
5 }
6
7 fun procesar(estado: Estado) = when (estado) {
8 is Estado.Cargando -> println("Cargando...")
9 is Estado.Exito -> println("Datos: ${estado.datos}")
10 is Estado.Error -> println("Error: ${estado.mensaje}")
11 }
Casting: is y as
casting.kt
KOTLIN
1 fun describir(obj: Any): String = when (obj) {
2 is String -> "Texto de longitud ${obj.length}"
3 is Int -> "Entero: $obj"
4 is Boolean -> if (obj) "Verdadero" else "Falso"
5 else -> "Tipo desconocido"
6 }
7
8 fun main() {
9 println(describir("Hola")) // Texto de longitud 4
10 println(describir(42)) // Entero: 42
11 println(describir(true)) // Verdadero
12 }
💻 Misión
Crea una sealed class `Resultado` con casos `Exito` y `Fallo`. Crea una función que use when para procesar cada caso.
👁️ Ver solución sugerida
main.kt
KOTLIN
1 sealed class Resultado {
2 data class Exito(val nota: Double) : Resultado()
3 data class Fallo(val razon: String) : Resultado()
4 }
5
6 fun evaluar(resultado: Resultado) = when (resultado) {
7 is Resultado.Exito -> println("Aprobado con ${resultado.nota}")
8 is Resultado.Fallo -> println("Reprobado: ${resultado.razon}")
9 }
10
11 fun main() {
12 evaluar(Resultado.Exito(9.5))
13 evaluar(Resultado.Fallo("No entregó el trabajo"))
14 }