Ключевое слово super
Ключевое слово super позволяет обращаться
к методам, свойствам и конструкторам родительского класса
из дочернего класса. Оно особенно полезно при переопределении
методов, когда нужно вызвать реализацию родительского класса
и дополнить её новой функциональностью.
Синтаксис
super.methodName() // вызов метода родителя
super.propertyName // обращение к свойству родителя
super() // вызов конструктора родителя
super<InterfaceName>.method() // вызов метода конкретного интерфейса
Пример
Вызов метода родительского класса при переопределении:
open class Animal {
open fun makeSound() {
println("Some generic animal sound")
}
}
class Dog : Animal() {
override fun makeSound() {
super.makeSound() // вызов метода родителя
println("Woof! Woof!")
}
}
val dog = Dog()
dog.makeSound()
Результат выполнения кода:
Some generic animal sound
Woof! Woof!
Пример
Обращение к свойству родительского класса:
open class Vehicle {
open val maxSpeed: Int = 100
}
class Car : Vehicle() {
override val maxSpeed: Int = 200
fun showSpeeds() {
println("Car max speed: $maxSpeed")
println("Vehicle max speed: ${super.maxSpeed}")
}
}
val car = Car()
car.showSpeeds()
Результат выполнения кода:
Car max speed: 200
Vehicle max speed: 100
Пример
Вызов конструктора родительского класса:
open class Person(val name: String) {
init {
println("Person created: $name")
}
}
class Student(name: String, val grade: Int) : Person(name) {
init {
println("Student created: $name, grade: $grade")
}
}
val student = Student("John", 5)
Результат выполнения кода:
Person created: John
Student created: John, grade: 5
Пример
Явное указание интерфейса при множественном наследовании:
interface A {
fun show() {
println("Interface A")
}
}
interface B {
fun show() {
println("Interface B")
}
}
class C : A, B {
override fun show() {
super<A>.show() // вызов метода из интерфейса A
super<B>.show() // вызов метода из интерфейса B
println("Class C")
}
}
val c = C()
c.show()
Результат выполнения кода:
Interface A
Interface B
Class C