Перейти к содержанию

🗒 Задача

В мобильной игре есть разные существа. Напиши интерфейсы для летающих и плавающих существ.

  • создай интерфейсы с методами передвижения для: карась, чайка, утка;

  • создай для каждого существа классы, реализующие соответствующие интерфейсы;

  • выведи сообщения в консоль, о том как они могут передвигаться.

❌ Ошибки

  • не используют множественное наследование для интерфейсов

  • именуют интерфейс для конкретного объекта

✏️ Комментарии

Окей, а как быть с тем, что, например, утка может и плавать, и летать?
Интерфейсы также как и классы именуются с заглавной буквы https://kotlinlang.org/docs/coding-conventions.html#naming-rules
Не совсем так. Интерфейс — он по сути безымянный, то есть универсальный. Например, он может отвечать только за плавание или только за полет (любого существа).
Хорошо, но нарушается принцип единой ответственности (см. [SOLID](https://habr.com/ru/companies/productivity_inside/articles/505430/)) потому что теперь я по ошибке или случайно могу заставить карася полететь и все сломается
Иногда спрашивают “А зачем нам интерфейсы?”
Есть два аспекта в изучении котлин:

- механика работы инструментов котлин
- применимость инструментов к реальным задачам

Сейчас важнее понять первое, на итоговом проекте будет про второе (там будет этап с Базой Данных где будут применяться интерфейсы).

Чтобы понятнее было сейчас, такое объяснение: класс может имплементировать много разных интерфейсов, таким образом объект который имплементировал разные интерфейсы, может быть использован в разных частях кода твоего приложения.

В Kotlin нет множественного наследования (когда у класса два класса родителя)

🧾 Решение

interface Flying {
    fun fly()
}

interface Swimming {
    fun swim()
}

class Seagull : Flying {
    override fun fly() {
        println("Чайка летит")
    }
}

class Duck : Flying, Swimming {
    override fun fly() {
        println("Утка летит")
    }

    override fun swim() {
        println("Утка плавает")
    }
}

class Carp : Swimming {
    override fun swim() {
        println("Карась плавает")
    }
}

fun main() {
    val seagull = Seagull()
    seagull.fly() 

    val duck = Duck()
    duck.fly()  
    duck.swim()  

    val carp = Carp()
    carp.swim() 
}