По умолчанию все классы, методы и свойства в Kotlin — финальные (final). То есть они не могут быть унаследованы или переопределены, если явно не указать модификатор open.
Ключевое слово open разрешает наследование класса или переопределение метода. Это фундаментальное отличие от Java, где классы по умолчанию открыты для наследования.
Пример:
open class Animal { open fun sayHello() { println("Hello from Animal!") } } class Dog : Animal() { override fun sayHello() { println("Woof!") } }
open из класса Animal — попытка наследования приведет к ошибке компиляции.override обязательно для методов/свойств, которые вы хотите переопределить.interface и не требуют open.В Kotlin можно наследовать любой класс так же, как и в Java?
Ответ: Нет, только классы, помеченные open (или abstract). Обычные классы финализированы и не могут быть унаследованы. Это сделано для повышения безопасности и предсказуемости кода.
Пример неправильного кода:
class Animal class Dog : Animal() // Ошибка компиляции: "Animal" is final
История
В проекте для платформы Android молодой разработчик попытался унаследовать пользовательский компонент от кастомного View-класса, забыв добавить open. Билд отвалился, причина была неочевидна, а сроки сдвинулись. Проблема обнаружилась только после внимательного чтения сообщения компилятора.
История
При разработке SDK спецификация требовала расширяемый базовый класс, но он был объявлен без open. После поставки клиентам выяснилось, что библиотеку нельзя расширять без изменений исходников. Пришлось выпускать обновление.
История
В одном из проектов старый Java-код мигрировали на Kotlin, забыв про закрытость классов по умолчанию. Большая часть unit-тестов, использовавшая моки, перестала компилироваться, что замедлило процесс релиза. Только после массового добавления open проблема была решена.