La palabra clave override en Kotlin se utiliza para indicar explícitamente la sobreescritura de métodos y propiedades de una superclase o interfaz.
En Java, se pueden sobreescribir métodos de la superclase sin la palabra clave, lo que a veces puede dar lugar a errores o errores tipográficos. En Kotlin, siguiendo el principio de seguridad, se requiere especificar override para cualquier sobreescritura y open para el propio miembro de la superclase.
El riesgo de ocultar accidentalmente métodos de la clase base (accidental overriding) y la necesidad de gestionar explícitamente los miembros heredados. Además, los métodos sobreescritos deben estar marcados como open; de lo contrario, no se pueden sobreescribir sin un error de compilación.
Usar la palabra clave override con métodos y propiedades de la superclase o interfaz, que previamente estén marcados como open, abstract o ya override.
Ejemplo de código:
open class Animal { open fun sound() = "???" } class Dog : Animal() { override fun sound() = "Woof!" }
Características clave:
override, no se puede sobreescribir el método: habrá un error de compilación;final a los métodos en Kotlin, solo se puede sobreescribir aquello que esté claramente marcado como open;override admite herencia múltiple a través de interfaces y clases.¿Se puede sobreescribir una propiedad o método si no está marcado como open/abstract/override?
No, solo los miembros marcados explícitamente como open/abstract/override pueden ser sobreescritos en la subclase.
¿Es obligatorio el override al implementar un método de interfaz?
Sí, siempre, incluso si es el primer nivel de implementación, el override es obligatorio: esta es la sintaxis de Kotlin para la uniformidad.
¿Puede un método marcado como override ser nuevamente sobreescrito?
Sí, si el método no está marcado como final (por defecto, el override hereda open), entonces también se puede sobreescribir más en la jerarquía.
Un desarrollador olvida poner open en la clase base:
class Cat { fun meow() = "meow" } class Tiger: Cat() { override fun meow() = "ROAR" // error de compilación }
Ventajas:
Desventajas:
Definición correcta de la clase y la intención de herencia:
open class Cat { open fun meow() = "meow" } class Tiger: Cat() { override fun meow() = "ROAR" }
Ventajas:
Desventajas: