🗒 Задача¶
В мобильной игре есть разные существа. Напиши интерфейсы для летающих и плавающих существ.
-
создай интерфейсы с методами передвижения для: карась, чайка, утка;
-
создай для каждого существа классы, реализующие соответствующие интерфейсы;
-
выведи сообщения в консоль, о том как они могут передвигаться.
❌ Ошибки¶
-
не используют множественное наследование для интерфейсов
-
именуют интерфейс для конкретного объекта
✏️ Комментарии¶
Интерфейсы также как и классы именуются с заглавной буквы 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()
}