En este tutorial aprenderás a cómo aplicar herencia en Kotlin entre clases. Explorarás sobre la clase Any, la sintaxis de herencia, sobrescritura de métodos y propiedades.
¿Qué Es Herencia?
La herencia es un mecanismo de la Programación Orientada a Objetos, para diseñar dos o más entidades que son diferentes, pero comparten muchas características en común.
El proceso consiste en definir una clase conocida como: clase base, clase padre, superclase o ancestro; que contenga todas las características en común.
Luego defines las clases que heredan las características, denominadas como subclases, clases hijas, clases derivadas o clases descendientes.
La Clase Any
La clase Any
es la raíz de la jerarquía de clases en Kotlin. Cada clase en el lenguaje derivará de ella si no especificas una superclase.
class Ejemplo // Hereda de Any
Si vas a la declaración de Any.kt
desde IntelliJ IDEA, verás que tiene 3 métodos:
equals()
: Indica si otro objeto es igual al actualhashCode()
: Retorna el código hash asociado al objetotoString()
: Retorna la representación enString
del objeto
Por ejemplo, ejecuta los métodos anteriores con dos instancias de Ejemplo
:
fun main() {
val ejemplo1 = Ejemplo()
val ejemplo2 = Ejemplo()
println(ejemplo1.toString())
println(ejemplo1.hashCode())
println(ejemplo1.equals(ejemplo2))
}
En la salida verás algo similar a:
Ejemplo@34a245ab
883049899
false
Sintaxis De Herencia En Kotlin
Para aplicar herencia en Kotlin, añade a la sintaxis de declaración de la clase así:
- Añade el modificador
open
para habilitar su capacidad de herencia - Añade dos puntos para expresar en la cabecera, que extiende de otra
- Añade los paréntesis al final del nombre de la superclase para especificar la llamada a su constructor.
open class Ancestro
class Descendiente: Ancestro()
Constructor Primario En Herencia
Si la superclase tiene constructor primario, debes inicializarlo pasando los parámetros en la llamada de la sintaxis de herencia.
open class Ancestro(val propiedad:Boolean)
class Descendiente(propiedad: Boolean) : Ancestro(propiedad)
Constructor Secundario En Herencia
Si la clase base no tiene constructor primario o deseas realizar la llamada del mismo, desde un constructor secundario de la subclase, entonces usa constructor
junto a la palabra reservada super
para la llamada.
Por ejemplo:
open class Weapon(val damage: Int, val speed: Double)
class Bow : Weapon {
constructor(damage: Int, speed: Double) : super(damage, speed)
}
La subclase Bow
inicializa las propiedades de Weapon
a través de la llamada del constructor primario con super(damage, speed)
.
Sobrescribir Métodos
Aplicar polimorfismo con la sobrescritura de métodos en Kotlin, requiere habilitar el método con el modificador open
.
Luego usa el modificador override
desde el método polifórmico la subclase.
Por ejemplo:
open class Character(val name: String) {
open fun die() = println("Morir")
}
class Mage(name: String) : Character(name) {
override fun die() = println("Mago muriendo")
}
fun main() {
val jaina = Mage("Jaina")
// Sucesos desafortunados...
jaina.die()
}
La clase base Character
tiene un método llamado die()
que imprime un mensaje sobre la muerte del personaje.
En la subclase Mage
, diseñada para los personajes tipos magos, sobrescribimos die()
con el fin de personalizar el mensaje.
Al crear una instancia de Mage
y ejecutar el método la salida imprimirá:
Mago muriendo
Sobrescribir Propiedades
Similar a la sobrecritura de métodos, sobrescribir una propiedad requiere usar el modificador override
sobre la propiedad en la subclase.
Si la propiedad está declarada con val
en la clase padre, es posible reescribirla con var
en la clase hija. Sin embargo, lo contrario no es posible.
Por ejemplo:
open class BaseItem(val name: String) {
open var quantity = 1
}
class PopularItem(name: String) : BaseItem(name) {
override var quantity = 6
}
fun main() {
// Añadir item regular de orden
val notebook = BaseItem("Cuaderno")
// Añadir item popular
val pencil = PopularItem("Lapicero")
// Mostrar factura
println("${notebook.name} x ${notebook.quantity}")
println("${pencil.name} x ${pencil.quantity}")
}
En el anterior código tenemos a la superclase BaseItem
que especifica los ítems por defecto añadidos a una factura. De ella hereda PopularItem
, con el fin de dar un tratamiento adicional a los ítems populares.
Como ves, se sobrescribe la propiedad quantity
en PopularItem
, donde toma una inicialización de 6
.
Luego creamos dos ítems, notebook
y pencil
. Al imprimir sus nombres y valores se muestra el cambio de la herencia:
Cuaderno x 1
Lapicero x 6