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 ООП інтерфейси


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

Для визначення інтерфейсу застосовується ключове слово interface . наприклад:

interface Movable{
    fun move()      // определение функции без реализации
    fun stop(){     // определение функции с реализацией по умолчанию
        println("Остановка")
    }
}

Інтерфейс містить дві функції. Функція move() являє абстрактний метод - вона не має реалізації. Друга функція stop має реалізацію за замовчуванням.

Ми не можемо безпосередньо створити об'єкт інтерфейсу, так як інтерфейс не підтримує конструктори і просто представляє контракт, яким клас, реалізующіій цей інтерфейс, повинен відповідати.

Визначимо два класи, які застосовують інтерфейс:

class Car : Movable{
 
    override fun move(){
        println("Машина едет")
    }
}
class Aircraft : Movable{
    override fun move(){
        println("Самолет летит")
    }
    override fun stop(){
        println("Приземление")
    }
}

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

Наприклад, в даному випадку інтерфейс Movable представляє функцонал транспортного засобу і визначає функції move (рух) і stop (зупинка).

Клас Car являє машину і застосовує інтерфейс Movable. Так як і інтерфейс містить абстрактний метод move, то клас Car обов'язково повинен його реалізувати. Функцію stop клас Car може не реалізувати, тому що вона вже містить реалізацію за замовчуванням. При реалізації функцій перед ними ставиться ключове слово override .

Клас Aircraft представляє літак і теж застосовує інтерфейс Movable. При цьому клас Aircraft реалізує обидві функції інтерфейсу.

Згодом в програмі ми можемо розглядати об'єкти класом Car і Aircraft як об'єкти Movable:

fun main(args: Array) {
 
    val m1: Movable = Car()
    val m2: Movable = Aircraft()
    // val m3: Movable = Movable() напрямую объект интерфейса создать нельзя
     
    m1.move()
    m1.stop()
    m2.move()
    m2.stop()
}

Консольний висновок програми:

interface Info{
    val model: String
        get() = "Undefined"
    val number: String
}

Перше властивість має геттер, а це значить, що воно має реалізацію за замовчуванням. При применеия інтерфейсу така властивість необов'язково реалізувати. Друге властивість - number є абстрактним, воно не має ні геттера, ні сетера, тобто не має реалізації за замовчуванням, тому класи його зобов'язані реалізувати.

Для реалізації інтерфейсу візьмемо вище певний клас Car:

class Car(mod: String, num: String) : Movable, Info{
 
    override val number: String
    override val model: String
    init{
        number = num
        model = mod
    }
    override fun move(){
        println("Машина едет")
    }
}

Тепер клас Car застосовує два інтерфейсу. Клас може застосовувати кілька інтерфейсів, в цьому випадку вони вказуються через кому, і всі ці інтерфейси клас повинен реалізувати. Клас Car реалізує обидва властивості. При цьому при реалізації властивостей в класі необов'язково вказувати геттер або сетер.

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

fun main(args: Array) {
 
    val m1: Car = Car("Tesla", "2345SDG")
    println(m1.model)
    println(m1.number)
 
    m1.move()
    m1.stop()
}

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