В тази статия ще се научите да работите с вложени и вътрешни класове с помощта на примери.
Котлин вложен клас
Подобно на Java, Kotlin ви позволява да дефинирате клас в друг клас, известен като вложен клас.
клас Външен (… клас Вложен (…))
Тъй като вложен клас е член на затварящия го клас Outer, можете да използвате .
нотация за достъп до Nested
класа и неговите членове.
Пример: Вложен клас 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()) )
Когато стартирате програмата, изходът ще бъде:
Вътре вложен клас. Извикване на функция от вътре вложен клас.
За потребители на Java
Вложеният клас в Kotlin е подобен на статичния вложен клас в Java.
В Java, когато декларирате клас в друг клас, той по подразбиране се превръща във вътрешен клас. Въпреки това в Kotlin трябва да използвате вътрешен модификатор, за да създадете вътрешен клас, който ще обсъдим по-нататък.
Kotlin Inner Class
Вложените класове в Kotlin нямат достъп до външния екземпляр на класа. Например,
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()) )
Горният код няма да се компилира, защото се опитахме да осъществим достъп до свойството foo от външен клас от вътрешния клас.
За да разрешите този проблем, трябва да маркирате вложения клас с вътрешен, за да създадете вътрешен клас. Вътрешните класове носят препратка към външен клас и имат достъп до външни членове на класа.
Пример: 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())") )
Когато стартирате програмата, изходът ще бъде:
Използване на външен обект: Външен вложен клас. Използване на вътрешен обект: Външен вложен клас.
Препоръчително четене: Анонимен вътрешен клас