Освоюємо 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)
}
Результат:
Мене звати Анатолій Непийвода і мій вік 56 років Анатолій Непийвода |
Абстрактний клас може мати як абстрактні так і неабстрактні члени (властивості та функції). Щоб задекларувати член як абстрактний, ви маєте використовувати ключове слово abstract явно.
abstract class Person(var name:String, var age:Int){
abstract fun introduce()
open fun details(){ // неабстрактна функція
println ("Ім'я: $name, вік: $age")
}
}
Неабстрактні члени успадкуються і можуть бути викликані через об'єкт класу нащадка.