Как переопределить методы при наследовании от класса в Kotlin

Ответ

В Kotlin переопределение методов требует явного указания модификатора open для родительского метода и override для дочернего:

open class Parent {
    open fun doSomething() {
        println("Parent implementation")
    }
}

class Child : Parent() {
    override fun doSomething() {
        println("Child implementation")
        super.doSomething() // вызов родительской реализации
    }
}

Ключевые моменты:

  1. Класс должен быть open для наследования
  2. Метод должен быть open для переопределения
  3. Обязательно использовать override в дочернем классе
  4. Можно вызвать родительскую реализацию через 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 в наследнике. И тогда будет вам хиросима, а не ошибка компиляции. Всё просто, как три копейки.