Котлін вкладений та внутрішній клас

У цій статті ви навчитесь працювати з вкладеними та внутрішніми класами за допомогою прикладів.

Вкладений клас Котліна

Подібно до Java, Kotlin дозволяє визначити клас у межах іншого класу, відомого як вкладений клас.

 клас Зовнішній (… клас Вкладений (…))

Оскільки вкладений клас є членом його зовнішнього класу Outer, ви можете використовувати .позначення для доступу до Nestedкласу та його членів.

Приклад: вкладений клас Котліна

 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 не мають доступу до зовнішнього екземпляра класу. Наприклад,

 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 зовнішнього класу зсередини вкладеного класу.

Для того, щоб вирішити цю проблему, вам потрібно позначити вкладений клас внутрішнім, щоб створити внутрішній клас. Внутрішні класи містять посилання на зовнішній клас і можуть отримувати доступ до членів зовнішнього класу.

Приклад: Внутрішній клас Котліна

 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())") )

Коли ви запускаєте програму, результат буде:

Використання зовнішнього об’єкта: Зовнішній вкладений клас. Використання внутрішнього об’єкта: Зовнішній вкладений клас.

Рекомендована література: Анонімний внутрішній клас

Цікаві статті...