Вложенный и внутренний класс Kotlin

В этой статье вы научитесь работать с вложенными и внутренними классами на примерах.

Вложенный класс Kotlin

Подобно Java, Kotlin позволяет вам определять класс внутри другого класса, известного как вложенный класс.

 class Outer (… class Nested (…))

Поскольку вложенный класс является членом включающего его класса 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 вам нужно использовать модификатор inner для создания внутреннего класса, который мы обсудим дальше.

Котлин Внутренний класс

Вложенные классы в 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 внешнего класса изнутри вложенного класса.

Чтобы решить эту проблему, вам необходимо пометить вложенный класс с помощью inner, чтобы создать внутренний класс. Внутренние классы несут ссылку на внешний класс и могут обращаться к внешним членам класса.

Пример: внутренний класс 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())") )

Когда вы запустите программу, вывод будет:

Использование внешнего объекта: Вне вложенного класса. Использование внутреннего объекта: вне вложенного класса.

Рекомендуемая литература: анонимный внутренний класс

Интересные статьи...