Neste artigo, você aprenderá a trabalhar com classes aninhadas e internas com a ajuda de exemplos.
Classe aninhada Kotlin
Semelhante ao Java, o Kotlin permite que você defina uma classe dentro de outra classe conhecida como classe aninhada.
classe externa (… classe aninhada (…))
Como a classe aninhada é membro de sua classe externa, você pode usar a .
notação para acessar a Nested
classe e seus membros.
Exemplo: classe aninhada 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()) )
Quando você executa o programa, a saída será:
Dentro da classe aninhada. Chamada de função de dentro da classe Nested.
Para usuários Java
A classe aninhada em Kotlin é semelhante à classe aninhada estática em Java.
Em Java, quando você declara uma classe dentro de outra classe, ela se torna uma classe interna por padrão. No entanto, em Kotlin, você precisa usar o modificador interno para criar uma classe interna que discutiremos a seguir.
Classe Kotlin Inner
As classes aninhadas em Kotlin não têm acesso à instância de classe externa. Por exemplo,
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()) )
O código acima não compilará porque tentamos acessar a propriedade foo da classe Outer de dentro da classe Nested.
Para resolver esse problema, você precisa marcar a classe aninhada com interno para criar uma classe interna. As classes internas carregam uma referência a uma classe externa e podem acessar os membros da classe externa.
Exemplo: Kotlin Inner Class
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())") )
Quando você executa o programa, a saída será:
Usando objeto externo: classe aninhada externa. Usando objeto interno: classe aninhada externa.
Leitura Recomendada: Classe Interna Anônima