Объясните, как работает ключевое слово 'super' в языке Kotlin?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Ключевое слово super используется для доступа к членам (свойствам, методам) родительского класса из дочернего класса.
Основные варианты использования:
-
Вызов конструктора родительского класса: Часто используется в конструкторе дочернего класса для вызова соответствующего конструктора родителя. Это обязательно, если родительский класс имеет первичный конструктор с параметрами.
open class Parent(val name: String) class Child(name: String) : Parent(name) { // Конструктор Child вызывает конструктор Parent, // передавая параметр name. } -
Доступ к членам родительского класса, переопределенным в дочернем: Позволяет обратиться к реализации метода или свойства в родительском классе, даже если они были переопределены (с помощью
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 } } -
Доступ к членам конкретного супертипа (в случае множественного наследования интерфейсов): Если класс реализует несколько интерфейсов, которые имеют члены с одинаковыми именами,
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 } }