I den här artikeln lär du dig att arbeta med kapslade och inre klasser med hjälp av exempel.
Kotlin kapslad klass
På samma sätt som Java låter Kotlin dig definiera en klass inom en annan klass som kallas kapslad klass.
klass Yttre (… klass Nestad (…))
Eftersom Nested-klassen är medlem i sin slutande klass Outer kan du använda .
notering för att komma åt Nested
klassen och dess medlemmar.
Exempel: Kotlin kapslad klass
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()) )
När du kör programmet blir resultatet:
Inuti kapslad klass. Funktionssamtal inifrån Nested class.
För Java-användare
Den kapslade klassen i Kotlin liknar den statiska kapslade klassen i Java.
I Java, när du förklarar en klass i en annan klass, blir den som standard en inre klass. Men i Kotlin måste du använda inre modifierare för att skapa en inre klass som vi kommer att diskutera nästa.
Kotlin inre klass
De kapslade klasserna i Kotlin har inte tillgång till den yttre klassinstansen. Till exempel,
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()) )
Ovanstående kod kommer inte att kompileras eftersom vi försökte komma åt foo-egenskapen för den yttre klassen inifrån Nested-klassen.
För att lösa problemet måste du markera den kapslade klassen med inner för att skapa en inre klass. Inre klasser har en referens till en yttre klass och har tillgång till yttre klassmedlemmar.
Exempel: 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())") )
När du kör programmet blir resultatet:
Använda yttre föremål: Utanför kapslad klass. Använda inre objekt: Utanför kapslad klass.
Rekommenderad läsning: Anonym inre klass