CodeBlanks Logo Icon CodeBlanks

by

by ile sınıf delegasyonu öğrenirsin.

by ile sınıf delegasyonu

Kotlin'de by anahtar kelimesi bir sınıfa bir arayüzün (interface) uygulamasını başka bir nesneye delege etmesini söyler. Örnek: class Service(logger: Logger) : Logger by logger. Burada Service bir Logger arayüzünü gerçekleştirir ama tüm Logger metotlarını logger parametresine yönlendirir.

Bu, miras (inheritance) yerine composition kullanmanın kısa yoludur. Service gerekirse bazı metotları kendi geçersiz kılabilir (override), kalanları delege eder. Mirasın esneklik eksikliğine düşmeden kod yeniden kullanımı sağlar.

Delegasyon vs miras

Delegasyon, miras yerine composition sağlar. Mirasta alt sınıf üst sınıfa sıkı bağlıdır; delegasyonda ise sınıf bir nesneyi sarar ve ona işi yönlendirir. Bir sınıf yalnızca tek sınıftan miras alabilir ama birden çok arayüze delege edebilir.

Örnek: class Repo(db: Db) : Db by db, Cache by cache iki arayüzü iki farklı nesneye delege eder. Delegasyon çalışma zamanında hedefi değiştirmeye de olanak tanır; mirasta bu mümkün değildir. Test ederken sahte (fake) bir nesne enjekte etmek daha kolaydır.

Uygulama Logger delegasyonu kur

interface Logger { fun log(message: String) } tanımla. class ConsoleLogger : Logger içinde override fun log(message: String) = println(message) yaz. class Service(logger: Logger) : Logger by logger tanımla. main içinde Service(ConsoleLogger()) oluştur ve service.log("Çalıştı") çağır.

Başlangıç kodu

Main.kt
interface Logger {
    fun log(message: String)
}

class ConsoleLogger : Logger {
    override fun log(message: String) = println(message)
}

// Service sınıfını tanımla: Logger delegesi logger ile

fun main() {
    val service = Service(ConsoleLogger())
    // service.log çağrısı yap
}

Örnek çözüm

Main.kt
interface Logger {
    fun log(message: String)
}

class ConsoleLogger : Logger {
    override fun log(message: String) = println(message)
}

class Service(logger: Logger) : Logger by logger

fun main() {
    val service = Service(ConsoleLogger())
    service.log("Çalıştı")
}

Beklenen çıktı

Çalıştı

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 class Service(logger: Logger) : Logger by logger ne yapar?

  • Yalnızca constructor çağırır
  • Logger metodlarını logger'a delege eder Doğru cevap
  • Yeni bir Logger oluşturur
  • Metotları gizler

Açıklama: by logger, Logger metodlarını logger nesnesine yönlendirir.

2 delegasyon bildirimini tamamla

Soru
class Service(logger: Logger) : Logger ____ logger
Cevap
class Service(logger: Logger) : Logger by logger

Açıklama: by logger delegasyonu belirtir.

3 delegasyon parçalarını eşle

Kavram Anlamı
by Delegasyon
interface Logger Sözleşme
class Service İstemci
logger Hedef

Orta seviye bölümündeki tüm dersler