Klasa zagnieżdżona i wewnętrzna Kotlin

W tym artykule nauczysz się pracować z klasami zagnieżdżonymi i wewnętrznymi za pomocą przykładów.

Klasa zagnieżdżona Kotlin

Podobnie jak Java, Kotlin umożliwia zdefiniowanie klasy w ramach innej klasy znanej jako klasa zagnieżdżona.

 klasa Zewnętrzna (… klasa Zagnieżdżona (…))

Ponieważ klasa zagnieżdżona jest członkiem otaczającej ją klasy Outer, można użyć .notacji, aby uzyskać dostęp do Nestedklasy i jej elementów członkowskich.

Przykład: klasa zagnieżdżona 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()) )

Po uruchomieniu programu wynik będzie następujący:

Wewnątrz klasy zagnieżdżonej. Wywołanie funkcji z wnętrza klasy zagnieżdżonej.

Dla użytkowników Java

Zagnieżdżona klasa w Kotlin jest podobna do statycznej klasy zagnieżdżonej w Javie.

W Javie, kiedy deklarujesz klasę wewnątrz innej klasy, domyślnie staje się ona klasą wewnętrzną. Jednak w Kotlinie musisz użyć wewnętrznego modyfikatora, aby utworzyć wewnętrzną klasę, którą omówimy dalej.

Klasa wewnętrzna Kotlin

Zagnieżdżone klasy w Kotlin nie mają dostępu do zewnętrznej instancji klasy. Na przykład,

 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()) )

Powyższy kod nie skompiluje się, ponieważ próbowaliśmy uzyskać dostęp do właściwości foo klasy Outer z wnętrza klasy zagnieżdżonej.

Aby rozwiązać ten problem, musisz oznaczyć klasę zagnieżdżoną wartością inner, aby utworzyć klasę wewnętrzną. Klasy wewnętrzne zawierają odwołanie do klasy zewnętrznej i mogą uzyskać dostęp do członków klasy zewnętrznej.

Przykład: klasa wewnętrzna 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())") )

Po uruchomieniu programu wynik będzie następujący:

Korzystanie z obiektu zewnętrznego: poza klasą zagnieżdżoną. Korzystanie z obiektu wewnętrznego: poza klasą zagnieżdżoną.

Zalecana literatura: Anonimowa klasa wewnętrzna

Interesujące artykuły...