Tässä artikkelissa opit työskentelemään sisäkkäisten ja sisäisten luokkien kanssa esimerkkien avulla.
Kotlinin sisäkkäinen luokka
Samoin kuin Java, Kotlin antaa sinun määrittää luokan toiseen luokkaan, joka tunnetaan sisäkkäisinä luokkina.
luokka Ulompi (… luokka Sisäkkäin (…))
Koska Nested-luokka on sen sulkevan luokan Outer jäsen, voit käyttää .
merkintää päästäksesi Nested
luokkaan ja sen jäseniin.
Esimerkki: Kotlinin sisäkkäinen luokka
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()) )
Kun suoritat ohjelmaa, tulos on:
Sisäkkäin luokan sisällä. Toimintakutsu sisäkkäisen luokan sisäpuolelta.
Java-käyttäjille
Kotlinin sisäkkäinen luokka on samanlainen kuin Javan staattinen sisäkkäinen luokka.
Kun ilmoitat Java-luokassa luokan toisen luokan sisällä, siitä tulee oletusarvoisesti sisempi luokka. Kotlinissa sinun on kuitenkin käytettävä sisäistä muokkaajaa luomaan sisäinen luokka, josta keskustelemme seuraavaksi.
Kotlinin sisempi luokka
Kotlinin sisäkkäisillä luokilla ei ole pääsyä ulompaan luokkainstanssiin. Esimerkiksi,
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()) )
Yllä olevaa koodia ei koota, koska yritimme käyttää Outer-luokan foo-omaisuutta sisäkkäisen luokan sisällä.
Tämän ongelman ratkaisemiseksi sinun on merkittävä sisäkkäinen luokka sisemmällä sisäisen luokan luomiseksi. Sisemmillä luokilla on viittaus ulompaan luokkaan, ja niillä on pääsy ulomman luokan jäseniin.
Esimerkki: Kotlinin sisäluokka
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())") )
Kun suoritat ohjelmaa, tulos on:
Ulkoobjektin käyttö: Sisäkkäisten luokkien ulkopuolella. Sisäisen objektin käyttäminen: Sisäkkäinen luokka.
Suositeltava lukeminen: Nimetön sisäluokka