Что можешь рассказать про абстрактные классы и интерфейсы в плане наследования

«Что можешь рассказать про абстрактные классы и интерфейсы в плане наследования» — вопрос из категории ООП, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Абстрактные классы и интерфейсы позволяют реализовать полиморфизм, но с разными подходами:

Абстрактный класс:

  • Может содержать реализованные методы и абстрактные (без реализации)
  • Поддерживает модификаторы доступа
  • Наследуется через 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") } // с реализацией
}

Выбор: интерфейсы для описания поведения, абстрактные классы - когда есть общая логика для наследников.