Ответ
В Kotlin переопределение методов требует явного указания модификатора open для родительского метода и override для дочернего:
open class Parent {
open fun doSomething() {
println("Parent implementation")
}
}
class Child : Parent() {
override fun doSomething() {
println("Child implementation")
super.doSomething() // вызов родительской реализации
}
}
Ключевые моменты:
- Класс должен быть
openдля наследования - Метод должен быть
openдля переопределения - Обязательно использовать
overrideв дочернем классе - Можно вызвать родительскую реализацию через
super
В Kotlin классы и методы по умолчанию final - это отличие от Java.
Ответ 18+ 🔞
А, ну это про то, как в Котлине методы переписывать! Да тут, бля, целая история, ебать мои старые костыли. Всё не как у людей, а наоборот.
Смотри, чувак. В Джаве ты что хочешь, то и делаешь — наследуйся от кого угодно, переопределяй что в голову взбредёт. А тут, ёпта, подход другой. Тут по умолчанию всё на замке, всё final. Представь себе — приходишь ты в гости, а тебе говорят: «Наследство? А хуй тебе, а не наследство! Всё моё, и трогать низя». Вот примерно так.
Чтобы что-то переопределить, нужно пройти квест. Сначала класс родительский надо разрешить к наследованию — повесить на него open. Это типа сказать: «Ладно, чувак, заходи, но руки помой». А потом и каждый метод, который хочешь, чтобы детишки могли поменять, тоже надо open пометить. Без этого — ни хуя себе, компилятор тебе впендюрит ошибку, и будешь сидеть, чесать репу.
open class Parent {
open fun doSomething() {
println("Parent implementation")
}
}
Вот смотри, объявили мы такого разрешающего родителя. А теперь делаем ребёнка:
class Child : Parent() {
override fun doSomething() {
println("Child implementation")
super.doSomething() // вызов родительской реализации
}
}
Видишь, override — это святое! Обязательно пиши, а то опять получишь по шапке от компилятора. Это чтобы все видели — да, я тут чужой метод ломаю, я не случайно, я специально!
И главное, смотри какая хитрая жопа: если захочешь старую реализацию ещё и вызвать — пожалуйста, super.doSomething(). Это типа: «Папа, я тут своё добавил, но ты тоже не стесняйся, сделай своё дело». Удобно, чё.
Короче, запомни: в Котлине по умолчанию всё закрыто, как банковский сейф. Хочешь что-то менять — открывай явно. open для класса и метода, override в наследнике. И тогда будет вам хиросима, а не ошибка компиляции. Всё просто, как три копейки.