Kotlin в IntelliJ IDEA Kotlin змінні Kotlin типи даних Kotlin операції з числами Kotlin умовні вирази Kotlin умовні конструкції Kotlin цикли Kotlin послідовності Kotlin масиви Kotlin функціональне програмування Kotlin змінна кількість параметрів. Vararg Kotlin повернення результату. оператор return Kotlin однорядкові і локальні функції Kotlin перевантаження функцій Kotlin Лямбда-вирази Kotlin функції вищого порядку Kotlin Анонімні функції Kotlin ООП Класи і об'єкти Kotlin ООП властивості Kotlin ООП конструктор Kotlin ООП функції в класах Kotlin ООП Пакети та імпорт Kotlin ООП модифікатори видимості Kotlin ООП вкладені класи Kotlin ООП інтерфейси Kotlin ООП спадкування Kotlin ООП Перевизначення методів і властивостей Kotlin ООП Абстрактні класи та методи Kotlin ООП Data-класи Kotlin ООП перерахування enums Kotlin ООП Null і nullable-типи Kotlin ООП Обробка винятків Kotlin ООП перетворення типів Kotlin ООП Інфіксна функція Kotlin ООП функції розширення Kotlin ООП Узагальнені класи і функції Kotlin ООП обмеження узагальнень Kotlin ООП Варіантність, коваріантність і контраваріантність Kotlin Колекції. Змінювані і незмінні колекції Kotlin Колекції. LIST список Kotlin Колекції. Set Kotlin Колекції. Map

Kotlin ООП спадкування


Спадкування дозволяє створювати класи, які розширюють функціональність або змінюють поведінку вже існуючих класів. Відносно успадкування виділяються два ключові компоненти. Перш за все це базовий клас (клас-батько, батьківський клас, суперклас), який визначає базову функціональність. І похідний клас (клас-спадкоємець, підклас), який успадковує функціональність базового класу і може розширювати або модифікувати її.

Щоб функціональність класу можна було успадкувати, необхідно визначити для цього класу анотацію open . За замовчуванням без цієї анотації клас не може бути успадкований.

open class Person(val name: String)
class Employee(name: String) : Person(name)

Наприклад, в даному випадку клас Person представляє людини, а клас Employee - працівника. Клас Person через первинний конструктор встановлює властивість name. Кожен працівник є людиною, тому щоб не дублювати в класі Employee функціональність класу Person просто успадковуємо її.

Для визначення похідного класу після його імені ставиться двокрапка, після якого йде назва базового класу. Тобто в даному випадку клас Person є базовим або суперкласом, а клас Employee - похідним класом або класом-спадкоємцем.

При спадкуванні необхідно ініціалізувати базовий клас. Якщо похідний клас має первинний конструктор, то разом з ним повинен викликатися конструктор базового класу.

open class Person(val name: String)
class Employee(val company: String, name: String): Person(name)

Якщо похідний клас не має ніяких конструкторів, то також після двокрапки йде виклик конструктора базового класу:

open class Person()
class Employee: Person()

Якщо похідний клас не має явного первинного конструктора, тоді при виклику вторинного конструктора повинен викликатися конструктор базового класу через ключове слово super :

open class Person(val name: String)
class Employee: Person{
 
    var company: String="undefined"
 
    constructor(name: String, comp:String) : super(name){
        company = comp
    }
}

Виклик super(_name) представляє виклик конструктора базового класу, якому передається значення параметра _name.

Застосування класів:

fun main(args: Array<String>) {
 
    val alice: Person = Person("Alice")
    val kate: Employee = Employee("Kate", "Google")
    val liza: Person = Employee("Liza", "Apple")
}
 
open class Person(val name: String)
class Employee: Person{
 
    var company: String="undefined"
 
    constructor(name: String, comp:String) : super(name){
        company = comp
    }
}

Причому оскільки об'єкт Employee в той же час є і об'єктом класу Person в силу відносини спадкування, то ми можемо змінної типу Person передати об'єкт Employee:

val liza: Person = Employee("Liza", "Apple")

Варто відзначити, що в Kotlin ми можемо успадкувати клас тільки від одного класу, множинне спадкування не підтримується.

Також, варто відзначити, що всі класи за замовчуванням успадковуються від класу Any, навіть якщо клас Any явно не вказаний як базового. Тому будь-який клас вже за замовчуванням буде мати всі властивості і функції, які визначені в класі Any. Тому всі класи за замовчуванням вже матимуть такі функції як equals, toString, hashcode.


Наш партнер:
beta test mp3 playlist downloader