English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Clases anidadas y clases internas en Kotlin

En este artículo, aprenderá a usar clases anidadas y clases internas con ejemplos.

Clases anidadas en Kotlin

Al igual que en Java, Kotlin le permite definir una clase dentro de otra clase denominada clase anidada

class Outer {
    ... .. ...
    class Nested {
        ... .. ...
    }
}

Dado que la clase anidada es un miembro externo (Outer) de la clase encerrada, se puede usar el símbolo . para acceder a la clase anidada y sus miembros.

Ejemplo: Ejemplo de uso de clases anidadas en Kotlin

class Outer {
    val a = "En el exterior de la clase anidada."
    class Nested {
        val b = "Dentro de la clase anidada."
        fun callMe() = "Llamar a funciones desde el interior de la clase anidada."
    }
}
fun main(args: Array<String>) {
    //Acceder a los miembros de la clase anidada
    println(Outer.Nested().b)
    //Crear un objeto de la clase anidada
    val nested = Outer.Nested()
    println(nested.callMe())
}

Al ejecutar el programa, la salida será:

Dentro de la clase anidada.
Llamar a funciones desde el interior de la clase anidada.

Para usuarios de Java

Las clases anidadas en Kotlin son similares a las clases anidadas estáticas en Java.

En Java, cuando declara una clase dentro de otra clase, por defecto se convierte en una clase interna. Pero en Kotlin, necesita usar el modificador inner para crear una clase interna, lo que discutiremos a continuación.

Clases internas en Kotlin

Las clases anidadas en Kotlin no tienen permiso para acceder a la instancia de la clase externa. Por ejemplo,

class Outer {
    val foo = "Fuera de la clase anidada."
    class Nested {
        //¡Error! No se puede acceder a los miembros de la clase externa.
        fun callMe() = foo
    }
}
fun main(args: Array<String>) {
    val outer = Outer()
    println(outer.Nested().callMe())
}

El código anterior no se puede compilar porque intentamos acceder al atributo foo de la clase externa desde el interior de la clase anidada.

Para resolver este problema, necesita usar la marca inner para crear una clase interna. La clase interna lleva una referencia a la clase externa y puede acceder a los miembros de la clase externa.

Ejemplo: Uso de clases internas en Kotlin

class Outer {
    val a = "En el exterior de la clase anidada."
    inner class Inner {
        fun callMe() = a
    }
}
fun main(args: Array<String>) {
    val outer = Outer()
    println("Uso de objetos externos: ${outer.Inner().callMe()}")
    val inner = Outer().Inner()
    println("Uso de objetos internos: ${inner.callMe()}")
}

Al ejecutar el programa, la salida será:

Uso de objetos externos: En el exterior de la clase anidada.
Uso de objetos internos: En el exterior de la clase anidada.