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 ООП Абстрактні класи та методи


Абстрактні класи - це класи, визначені з модифікатором abstract . Відмінною особливістю абстрактних класів є те, що ми не можемо створити об'єкт подібного класу. Наприклад, визначимо абстрактний клас Human:

abstract class Human(val name: String)

Абстрактний клас, як і звичайний, може мати властивості, функції, конструктори, але створити його об'єкт безпосередньо викликавши його конструктор ми не можемо:

val kate: Human     // норм, просто определение переменной
val alice: Human = Human("Alice")   // ! ошибка, создать объект нельзя

Такий клас ми можемо тільки успадкувати:

abstract class Human(val name: String){
 
    fun hello(){
        println("My name is $name")
    }
}
class Person(name: String): Human(name)

Варто відзначити, що в даному випадку перед абстрактним класом не треба вказувати анотацію open , як при спадкуванні неабстрактне класів.

fun main(args: Array<String>) {
 
    val kate: Person = Person("Kate")
    val slim: Human = Person("Slim Shady")
    kate.hello()    // My name is Kate
    slim.hello()    // My name is Slim Shady
}

Абстрактні класи можуть мати абстрактні методи. Це такі функції, які визначаються з ключовим словом abstract і не містять реалізацію, тобто у них немає тіла. При цьому абстрактні методи можна визначити тільки в абстрактних класах:

abstract class Human(val name: String){
 
    abstract fun hello()
}
class Person(name: String): Human(name){
 
    override fun hello(){
        println("My name is $name")
    }
}

Якщо клас успадковується від абстрактного класу, то він повинен реалізувати всі його абстрактні методи. Так, в даному випадку клас Person повинен обов'язково визначити реалізацію для функції hello. При цьому, як і при перевизначенні звичайних методів, застосовується анотація override .

Навіщо потрібні абстрактні класи? Класи зазвичай відображають якісь сутності реального світу. Але деякі з цих сутностей представляють абстракцію, яка безпосереднього втілення не має. Наприклад, візьмемо систему геометричних фігур. В реальності не існує геометричної фігури як такої. Є коло, прямокутник, квадрат, але просто фігури немає. Однак ж і коло, і прямокутник мають щось спільне і є фігурами. У цьому випадку ми можемо визначити абстрактний клас фігури і потім від нього успадкувати всі інші класи фігур:

// абстрактный класс фигуры
abstract class Figure {
    // абстрактный метод для получения периметра
    abstract fun perimeter(): Float
 
    // абстрактный метод для получения площади
    abstract fun area(): Float
}
// производный класс прямоугольника
class Rectangle(val width: Float, val height: Float) : Figure()
{
    // переопределение получения периметра
    override fun perimeter(): Float{
        return width * 2 + height * 2;
    }
    // переопрелеление получения площади
    override fun area(): Float{
        return width * height;
    }
}

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