Ключевое слово super

Ключевое слово super позволяет обращаться к методам, свойствам и конструкторам родительского класса из дочернего класса. Оно особенно полезно при переопределении методов, когда нужно вызвать реализацию родительского класса и дополнить её новой функциональностью.

Синтаксис

kotlinsuper.methodName()          // вызов метода родителя
super.propertyName          // обращение к свойству родителя
super()                     // вызов конструктора родителя
super<InterfaceName>.method() // вызов метода конкретного интерфейса

Пример

Вызов метода родительского класса при переопределении:

kotlinopen 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()

Результат выполнения кода:

kotlinSome generic animal sound
Woof! Woof!

Пример

Обращение к свойству родительского класса:

kotlinopen 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()

Результат выполнения кода:

kotlinCar max speed: 200
Vehicle max speed: 100

Пример

Вызов конструктора родительского класса:

kotlinopen 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)

Результат выполнения кода:

kotlinPerson created: John
Student created: John, grade: 5

Пример

Явное указание интерфейса при множественном наследовании:

kotlininterface 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()

Результат выполнения кода:

kotlinInterface A
Interface B
Class C

Смотрите также

  • ключевое слово override,
    которое используется для переопределения членов класса
  • ключевое слово open,
    которое позволяет наследоваться от класса
  • ключевое слово class,
    которое используется для объявления классов
  • ключевое слово interface,
    которое используется для объявления интерфейсов