Перейти до вмісту

Освоюємо Kotlin/Абстрактні класи

Матеріал з Вікіпідручника


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

Абстрактні класи можуть мати конструктори. Ці конструктори ініціалізують властивості класу і задають необхідні параметри для підкласів. Абстрактні класи оголошуються з використанням ключового слова abstract. Вони є відкритими для наслідування, тому ключове слово open не потрібне.

Ось приклад оголошення абстрактного класу Person:

abstract class Person(var name:String, var age:Int){
    abstract fun introduce()
}

Оголошення функції introduce() як абстрактної означає, що вона обов'язково повинна бути реалізована у класі нащадку.

Наступний приклад демонструє створення класу Doctor нащадку від класу Person, який реалізовує функцію introduce. Для того, щоб реалізувати функцію використовується слово override (замістити).

abstract class Person(var name:String, var age:Int){
    abstract fun introduce()
}

class Doctor(name:String, age:Int, var specialization:String):Person (name, age){
    override fun introduce() {
        println ("Мене звати $name і мій вік $age років")
    }
}

fun main(){
    //val person =Person("Анатолій Непийвода", 56) //так не можна, абстрактні класи не ініціалізуються
    
    val doctor=Doctor("Анатолій Непийвода", 56, "терапевт")
    doctor.introduce()
    println(doctor.name)
}
Standard input or output Результат:
Мене звати Анатолій Непийвода і мій вік 56 років
Анатолій Непийвода

Абстрактний клас може мати як абстрактні так і неабстрактні члени (властивості та функції). Щоб задекларувати член як абстрактний, ви маєте використовувати ключове слово abstract явно.

abstract class Person(var name:String, var age:Int){
    abstract fun introduce()
    open fun details(){                        // неабстрактна функція
        println ("Ім'я: $name, вік: $age")
    }
}

Неабстрактні члени успадкуються і можуть бути викликані через об'єкт класу нащадка.