Kotlin: Inner Classes (базова інфа)
Наступний на рогляді у нас Inner class.
- Inner — внутрішній.
- Nested — вкладений.
Inner class дещо відрізняється від звичайного Nested class-а тим, що має зв’язок з зовнішнім своїм класом. І ще його основна відмінність.
На перший погляд здається наче “ааа, ну ладно, ок”, але насправді це дає нам дещо нові можливості з тим, як ми себе поводимо з класами, а значить — ми можете вирішувати наші задачі різними шляхами.
Давайте розпочнемо з того, як власне створити inner class. Для того, щоб створити inner клас — нам потрібно створити звичайний клас як ми це завжди робимо (тобто за допомогою ключового слова class та назви), після чого додати ключове слово inner перед словом class, щоб вийшло ось так (як на скріншоті):
Але, не все так просто, як може здатись на перший погляд.
На відміну від звичайних або Nested класів, у inner класах є певні умови за яких можна їх створювати.
По-перше, inner class повинен бути всередині якогось другого класа, наприклад, ось так:
Якщо ми створемо просто inner class Car як зовнішній клас, тобто не в середині якогось іншого, то в нас це просто не вийде зробити.
Також, звертаю вашу увагу на те, що якщо ми створемо просто клас в середині класа (без ключового слова Inner), то це буде Nested клас.
В цілому воно має право на існування, але наскільки ми пам’ятаємо, то сенсу в таких класах не багато.
Звідси, можливо у вас з’явиться питання, а в чому тоді особливість цих inner класів, а я вам покажу…
☝🏻 Вкладений клас, позначений як внутрішній, може отримати доступ до членів свого зовнішнього класу. Внутрішні класи містять посилання на об’єкт зовнішнього класу.
Давай на прикладі це розберемось.
Візьмемо клас Smartphone і створено в ньому проперті battery, яка буде символізувати показник батареї, ось таком вот чином:
Тепер в середині нього давайте створено звичайний nested class, наприклад GooglePixel, щоб вийшло ось так:
Як бачите у нас є функція about, яка повертає String як опис того, що Puxel 6 має “ось таку” батарею, але щось тут не так.
Наш nested клас немає доступу до проперті battery… чому?
Тому що знову ж таки: це просто клас всередині класа, між ними немає ніякого зв’язку окрім як “географічного”, бо він саме всередині цього класа.
Якщо ж ми позначемо наш клас GooglePixel як inner, то Kotlin автоматично виправить цю проблему, чому?
Тому що класи позначені як inner мають доступ до “зовнішніх” пропертіс і до свого зовнішнього класа.
І виглядає це наступним чином:
І це досить круто, тому що це дає нам зможу писати нашу логіку програми таким чином, що ми можемо розділяти на щось “зовнішнє” та “внутрішнє”.
🎬 Ось мій канал, де будуть всі відео на різні теми в програмуванні:
📚 Ось мій Patreon, де будуть всі матеріали в текстовому форматі, додаткова інфа, розбір приклдів, домашні завдання, ІТ-словник, і тд:
Окрім цього, там є різні пропозиції, наприклад, можемо займатись 1х1, можу допомогти зробити резюме, проведу співбесіду і так далі.
🎬 Весь контент, який я роблю — це все мій особистий досвід.
Я пишу/знімаю все сам і ділюсь з вами корисною інформацією, яку ніхто не розповідає, тому підтримайте підпискою ❤️
🙂 На цьому у мене — все!
👉🏻 Ставте лексуси, підписуйтесь і будьте умнічками.
Якщо я правий — похваліть, якщо ні — посваріть.
Но в любому випадку не забудьте дати фідбек 😉
Успіхів! 🇺🇦🦄