Sobes.tech
Junior

Kotlin dilinde 'super' anahtar kelimesinin nasıl çalıştığını açıklayın.

sobes.tech yapay zeka

AI'dan gelen yanıt

Anahtar kelime super, alt sınıftan ebeveyn sınıfın üyelerine (özellikler, metodlar) erişmek için kullanılır.

Ana kullanım biçimleri:

  1. Ebeveyn sınıfın yapıcısını çağırmak: Sıklıkla, alt sınıfın yapıcısında ebeveynin karşılık gelen yapıcısını çağırmak için kullanılır. Bu, ebeveyn sınıfın parametre alan birincil yapıcısı varsa zorunludur.

    open class Parent(val name: String)
    
    class Child(name: String) : Parent(name) {
        // Child yapıcısı, Parent yapıcısını çağırır,
        // name parametresini geçirerek.
    }
    
  2. Alt sınıfta yeniden tanımlanmış ebeveyn üyelerine erişim: Bir metod veya özelliğin ebeveyn sınıfındaki uygulamasına, alt sınıfta yeniden tanımlanmış olsa bile, erişmek için kullanılır (override ile).

    open class Base {
        open fun greet() {
            println("Hello from Base")
        }
    
        open val value: Int = 1
    }
    
    class Derived : Base() {
        override fun greet() {
            super.greet() // Base'ten greet() çağrısı
            println("Derived'ten Merhaba")
        }
    
        override val value: Int = 2
            get() {
                println("Derived değerine erişiliyor")
                return super.value + 1 // Base'ten value erişimi
            }
    }
    
  3. Belirli bir üst tipe ait üyeye erişim (çoklu arayüz kalıtımı durumunda): Bir sınıf, aynı isimde üyeleri olan birkaç arayüzü uygularsa, super ile birlikte köşeli parantez içinde arayüz adını (super<TypeName>) belirterek, hangi arayüzün üyesine erişileceği netleştirilebilir.

    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'den foo() çağrısı
            super<MyInterface2>.foo() // MyInterface2'den foo() çağrısı
        }
    }