Ответ
Абстрактные классы и интерфейсы позволяют реализовать полиморфизм, но с разными подходами:
Абстрактный класс:
- Может содержать реализованные методы и абстрактные (без реализации)
- Поддерживает модификаторы доступа
- Наследуется через
extends, только один родитель - Имеет конструктор
abstract class Animal {
abstract fun makeSound()
fun sleep() { println("Sleeping") }
}
Интерфейс:
- До Kotlin 1.4 мог содержать только абстрактные методы, теперь поддерживает реализацию
- Все методы по умолчанию
openиpublic - Реализуется через
implements, можно несколько интерфейсов - Нет конструктора
interface Drawable {
fun draw() // абстрактный
fun defaultImpl() { println("Default") } // с реализацией
}
Выбор: интерфейсы для описания поведения, абстрактные классы - когда есть общая логика для наследников.