Sobes.tech
Junior

Kotlin'de kalıtım ve çok biçimlilik nasıl düzenlenmiştir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Kotlin'de kalıtım, sınıflar ve arayüzler mekanizmasıyla gerçekleştirilir. Sınıflar yalnızca bir başka sınıftan kalıtım yapabilir (tekli kalıtım), ancak birden çok arayüzü uygulayabilirler.

Varsayılan olarak, Kotlin'deki tüm sınıflar 'final'dır, yani kalıtılamazlar. Kalıtıma izin vermek için, sınıf açıkça open anahtar kelimesiyle işaretlenmelidir.

Sınıf Kalıtımı:

open class Shape { // Temel sınıf, open olarak işaretlenmiş
    open fun draw() { // Üzerinden değiştirilebilecek metod
        println("Şekil çiziliyor")
    }
}

class Circle : Shape() { // Shape'ten kalıtım
    override fun draw() { // Metodu geçersiz kılma
        println("Daire çiziliyor")
    }
}

Alt sınıfın yapıcı fonksiyonunda, temel sınıfın yapıcı fonksiyonunu açık veya örtük şekilde çağırmak gerekir.

Arayüzler:

Kotlin'deki arayüzler, Java 8'deki arayüzlere benzer ve soyut metodlar ile gövdesi olan metodlar içerebilir. Sınıflar, bir veya daha fazla arayüzü uygulayabilir.

interface Drawable {
    fun draw() // Soyut metod
    fun description() { // Varsayılan gövdesi olan metod
        println("Bu bir çizilebilir nesnedir")
    }
}

class Square : Drawable {
    override fun draw() { // Soyut metodun uygulaması
        println("Kare çiziliyor")
    }
    // description() isteğe bağlı olarak geçersiz kılınabilir
}

Polimorfizm:

Kotlin'de polimorfizm, ortak temel tür (sınıf veya arayüz) aracılığıyla farklı sınıflardan nesnelerle çalışma yeteneğiyle elde edilir. Bu, çalışma zamanında nesnenin gerçek türüne özgü metodların çağrılmasını sağlar.

fun render(drawable: Drawable) {
    drawable.draw() // Nesnenin gerçek türüne göre draw() metodunu çağırır
    drawable.description()
}

fun main() {
    val circle: Shape = Circle() // Circle nesnesi Shape olarak kabul edilir
    circle.draw() // Polimorfizm sayesinde Circle'dan draw() çağrılır

    val square: Drawable = Square() // Square nesnesi Drawable olarak kabul edilir
    render(square) // Square'dan draw() ve description() çağrılır
}

Bu örnekte, render herhangi bir Drawable uygulayan nesneyle çalışır. drawable.draw() çağrısı, nesnenin gerçek türü olan (Square) için draw metodunun uygulamasını çalıştırır.

Sınıf kalıtımı ile arayüz uygulaması arasındaki farklar:

  • Sınıf kalıtımı: "bir şeydir" (is-a) ilişkisi kurar. Alt sınıf, temel sınıfın durumu ve davranışını miras alır.
  • Arayüz uygulaması: "yetenek" veya "sözleşme" tanımlar. Sınıf, arayüzün tüm soyut metodlarının uygulamasını sağlayacağını taahhüt eder.

Karşılaştırma tablosu:

Özellik Sınıf Kalıtımı Arayüz Uygulaması
İlişki Türü is-a Yetenek / Sözleşme
Çoklu Kalıtım Tekil Çoklu
Durum Temel sınıfın durumunu miras alır Durumu miras almaz
Metot Uygulaması Uygulama içerebilir Varsayılan uygulama içerebilir (Java 8'den itibaren)