Sobes.tech
Junior

Kotlin dilində 'super' açar sözünün necə işlədiyini izah edin.

sobes.tech Süni İntellekt

AI-dan cavab

Açar söz super, valide (xüsusiyyətlər, metodlar) valide sinifindən övlad sinifinə daxil olmaq üçün istifadə olunur.

Əsas istifadə üsulları:

  1. Valide sinifin konstruktorunu çağırmaq: Bu, çox vaxt övlad sinfinin konstruktorunda valide konstruktorunu çağırmaq üçün istifadə olunur. Əgər valide sinifin parametrli əsas konstruktoru varsa, bu mütləqdir.

    open class Parent(val name: String)
    
    class Child(name: String) : Parent(name) {
        // Child konstruktoru, Parent konstruktorunu çağırır,
        // name parametrini ötürür.
    }
    
  2. Valide sinifin üzvlərinə, övlad sinifində yenidən təyin edilmiş olsa belə, daxil olmaq: Bu, valide sinifdəki metod və ya xüsusiyyətin tətbiqinə daxil olmaq imkanı verir, hətta onlar override ilə yenidən təyin olunsa da.

    open class Base {
        open fun greet() {
            println("Hello from Base")
        }
    
        open val value: Int = 1
    }
    
    class Derived : Base() {
        override fun greet() {
            super.greet() // Base-dən greet() çağırışı
            println("Derived-dən Salam")
        }
    
        override val value: Int = 2
            get() {
                println("Derived dəyərinə daxil olmaq")
                return super.value + 1 // Base-dən value-ya daxil olmaq
            }
    }
    
  3. Müəyyən bir supertipin üzvlərinə daxil olmaq (çoxlu irsiyyət halında): Əgər sinif bir neçə interfeys həyata keçirirsə və onların üzvləri eyni adlara malikdirsə, super ilə birlikdə interfeys adını bucaq mötərizələrdə (super<TypeName>) göstərməklə, hansı interfeysə aid üzvünə müraciət ediləcəyi aydın olur.

    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-dən foo() çağırışı
            super<MyInterface2>.foo() // MyInterface2-dən foo() çağırışı
        }
    }