Kotlin делает классы и функции final по умолчанию, чтобы соблюдать принцип: "проектируй для наследования или запрети его" — рекомендация, популяризированная книгой Effective Java Джошуа Блоха.
open сигнализирует о ясности проектного решения — автор сознательно подготовил его к расширениюЧтобы позволить классу или функции наследоваться или переопределяться, нужно явно использовать ключевое слово open:
open class Animal {
open fun speak() { println("...") }
}
class Dog : Animal() {
override fun speak() { println("Woof!") }
}
Вместо расширения классов Kotlin направляет разработчиков на использование композиции — создание сложного поведения путём комбинирования небольших, сфокусированных объектов:
Это поведение по умолчанию — намеренное архитектурное ограничение. Оно заставляет разработчиков осознанно принять решение перед тем, как открыть класс для наследования, что в итоге даёт более стабильную, предсказуемую и поддерживаемую кодовую базу.
В Kotlin классы по умолчанию являются final, что означает, что наследование полностью запрещено, если родительский класс явно не использует ключевое слово open.
Новый — ещё не проверен сообществом
Вы