Herencia En Kotlin

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 actual
  • hashCode(): Retorna el código hash asociado al objeto
  • toString(): Retorna la representación en String 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

Únete Al Discord De Develou

Si tienes problemas con el código de este tutorial, preguntas, recomendaciones o solo deseas discutir sobre desarrollo Android conmigo y otros desarrolladores, únete a la comunidad de Discord de Develou y siéntete libre de participar como gustes. ¡Te espero!