Назад к вопросам
Junior
119
questionbank

Объясните, как работает ключевое слово 'super' в языке Kotlin?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Ключевое слово super используется для доступа к членам (свойствам, методам) родительского класса из дочернего класса.

Основные варианты использования:

  1. Вызов конструктора родительского класса: Часто используется в конструкторе дочернего класса для вызова соответствующего конструктора родителя. Это обязательно, если родительский класс имеет первичный конструктор с параметрами.

    open class Parent(val name: String)
    
    class Child(name: String) : Parent(name) {
        // Конструктор Child вызывает конструктор Parent,
        // передавая параметр name.
    }
    
  2. Доступ к членам родительского класса, переопределенным в дочернем: Позволяет обратиться к реализации метода или свойства в родительском классе, даже если они были переопределены (с помощью override) в дочернем.

    open class Base {
        open fun greet() {
            println("Hello from Base")
        }
    
        open val value: Int = 1
    }
    
    class Derived : Base() {
        override fun greet() {
            super.greet() // Вызов greet() из Base
            println("Hello from Derived")
        }
    
        override val value: Int = 2
            get() {
                println("Accessing Derived value")
                return super.value + 1 // Доступ к value из Base
            }
    }
    
  3. Доступ к членам конкретного супертипа (в случае множественного наследования интерфейсов): Если класс реализует несколько интерфейсов, которые имеют члены с одинаковыми именами, super в сочетании с указанием имени интерфейса в угловых скобках (super<TypeName>) позволяет однозначно указать, к какому члену какого интерфейса обратиться.

    interface MyInterface1 {
        fun foo() { println("MyInterface1 foo") }
    }
    
    interface MyInterface2 {
        fun foo() { println("MyInterface2 foo") }
    }
    
    class MyClass : MyInterface1, MyInterface2 {
        override fun foo() {
            super<MyInterface1>.foo() // Вызов foo() из MyInterface1
            super<MyInterface2>.foo() // Вызов foo() из MyInterface2
        }
    }