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 Nested
klasy 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