English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
En este artículo, aprenderá a usar clases anidadas y clases internas con ejemplos.
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.
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.
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.
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.