Clase interna y anidada de Kotlin

En este artículo, aprenderá a trabajar con clases internas y anidadas con la ayuda de ejemplos.

Clase anidada de Kotlin

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

 clase Outer (… clase anidada (…))

Dado que la clase anidada es miembro de su clase adjunta Outer, puede usar la .notación para acceder a la Nestedclase y sus miembros.

Ejemplo: clase anidada de Kotlin

 class Outer ( val a = "Outside Nested class." class Nested ( val b = "Inside Nested class." fun callMe() = "Function call from inside Nested class." ) ) fun main(args: Array) ( // accessing member of Nested class println(Outer.Nested().b) // creating object of Nested class val nested = Outer.Nested() println(nested.callMe()) )

Cuando ejecute el programa, la salida será:

Dentro de la clase anidada. Llamada a función desde dentro de la clase anidada.

Para usuarios de Java

La clase anidada en Kotlin es similar a la clase anidada estática en Java.

En Java, cuando declaras una clase dentro de otra clase, se convierte en una clase interna por defecto. Sin embargo, en Kotlin, debe usar el modificador interno para crear una clase interna que discutiremos a continuación.

Clase interior de Kotlin

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

 class Outer ( val foo = "Outside Nested class." class Nested ( // Error! cannot access member of outer class. fun callMe() = foo ) ) fun main(args: Array) ( val outer = Outer() println(outer.Nested().callMe()) )

El código anterior no se compilará porque intentamos acceder a la propiedad foo de la clase Outer desde dentro de la clase Nested.

Para resolver este problema, debe marcar la clase anidada con inner para crear una clase interna. Las clases internas llevan una referencia a una clase externa y pueden acceder a los miembros de la clase externa.

Ejemplo: clase interior de Kotlin

 class Outer ( val a = "Outside Nested class." inner class Inner ( fun callMe() = a ) ) fun main(args: Array) ( val outer = Outer() println("Using outer object: $(outer.Inner().callMe())") val inner = Outer().Inner() println("Using inner object: $(inner.callMe())") )

Cuando ejecute el programa, la salida será:

Uso de objeto externo: clase anidada exterior. Usando objeto interno: Clase anidada externa.

Lectura recomendada: Clase interna anónima

Articulos interesantes...