Переопределение методов (функций)

Переопределение методов (функций)

В ООП функции-члены классов также называются методами. По функциональности они выполняют одно и тоже и работают также, как и обычные функции, использование термина метод вместо функция это просто соглашение. Для переопределения методов необходимо чтобы класс был объявлен с модификатором open иначе члены класса невозможно переопределить в производных (дочерних) классах. Все члены предназначенные для переопределения также должны быть объявлены с модификатором open:

open class Parent {
    open fun printText() {}

    fun notOverrideable() {}
}

class Child : Parent() {
    override fun printText() {
        super.printText()
    }
}

В примере выше класс Parent объявлен как open, что означает можно переопределять члены класса, которые также объявлены как open. Если open не писать класс или члены класса, считаются непереопределяемыми, который также можно явно указать, используя ключевое слово final. Также в производном классе нельзя объявлять функцию с одинаковой сигнатурой (название, параметры и тип параметров подразумевается под словом сигнатура) с закрытой функцией в родительском классе. В примере выше, написать функцию в классе Child с именем notOverrideable, которая не принимает параметры нельзя, так как сигнатуры совпадают, но можно написать функцию printText, которая по сигнатуре одинакова с функцией printText в базовом (родительском) классе по имени Parent.

Метод указанный open в родительском классе также автоматически становится открытым для переопределения в производных классах класса Child (из примера выше) и если необходимо запретить переопределение необходимо метод переписать используя ключевое слово final:

class Child : Parent() {
// Теперь класс printText нелья переопределить в производных классах класса Child.
    final override fun printText() {
        super.printText()
    }
}

В процессе наследования все доступные члены базового класса автоматически становятся доступными и в производном классе, только производный класс может также расширить базовый класс необходимыми методами и свойствами.