Kotlin kapslad och inre klass

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 Nestedklassen 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

Intressanta artiklar...