Sobes.tech
Junior

Kotlin тилинде 'super' ачкыч сөзүнүн иштешин түшүндүрүңүз.

sobes.tech AI

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() // Base классынан greet() чакыруу
            println("Hello from Derived")
        }
    
        override val value: Int = 2
            get() {
                println("Accessing Derived value")
                return super.value + 1 // Base класстын valueсына жетүү
            }
    }
    
  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() // MyInterface1дин foo() чакыруу
            super<MyInterface2>.foo() // MyInterface2дин foo() чакыруу
        }
    }