Konu geçmişi:
Kotlin, Java'nın en iyi yönlerini ve JVM'nin işlevsel mirasını birleştirmiştir. Normal sınıflar, standart yapılar olarak tanımlanır, soyut sınıflar, varsayılan bir uygulama ile eksik tanımlı şablonlar oluşturmayı sağlar ve arayüzler, durum olmadan davranışın çoklu kalıtımını destekler.
Sorun:
Sınıf, soyut sınıf ve arayüz arasında doğru seçim, uygulamanın mimarisini, kodun granülerliğini ve genişleyebilirliğini belirler. Yanlış kalıtım, test etme ve gelecekteki değişiklikler açısından zorluklara yol açar.
Çözüm:
Kotlin'de:
Kod örneği:
interface Drawable { fun draw() } abstract class Shape(var color: String) : Drawable { abstract fun calcArea(): Double override fun draw() = println("Shape drawn") } class Circle(color: String, val radius: Double) : Shape(color) { override fun calcArea() = Math.PI * radius * radius }
Ana özellikler:
Arayüzler, backing field ile özellikler içerebilir mi?
Hayır, yalnızca özelliğin imzasını tanımlayabilirler, ancak verileri depolayamazlar - yalnızca backing field olmayan özellikler.
Birden fazla sınıftan miras alabilir miyim?
Hayır, Kotlin yalnızca tekil sınıf kalıtımını destekler, ancak arayüzlerin çoklu uygulamasını destekler.
Arayüzde yapıcı ilan edilebilir mi?
Hayır, arayüzler yapıcıları desteklemez, çünkü durum tutmazlar - yalnızca davranış sözleşmesini.
Uygulamaya tüm ortak fonksiyonlar, içinde herhangi bir mantık veya durum olmasa bile, soyut bir sınıfa taşındı, sadece genel bir sözleşmeye ihtiyaç varken.
Artılar:
Eksiler:
Sadece gerekli sözleşmeleri arayüzlere taşıdılar, soyut sınıfları genel özellikler ve uygulama gerektiren yöntemlerle sınırladılar.
Artılar:
Eksiler: