CodeBlanks Logo Icon CodeBlanks

Özet - Delegasyon

by, lazy ve custom delegate'i birleştirerek bir önbellek sistemi yazarsın.

Özet - Delegasyon

Bu grupta beş delegasyon aracı öğrendin. by bir sınıfa arayüz metodlarını başka nesneye delege ettirir. by lazy ertelenmiş hesaplama, by observable değişiklik izleme sağlar.

by map özellikleri bir haritadan okur. vetoable koşula göre atamayı reddeder. Özel delegate getValue ve setValue operatörleriyle davranışı tam denetler. Her araç composition ve kod yeniden kullanımı için güçlü bir yoldur.

Doğru delegasyonu seçmek

İşe göre aracı seç: sınıf delegasyonu için by, ertelenmiş hesaplama için by lazy, değişiklik izleme için observable. Dinamik veri için by map, doğrulama için vetoable, tam denetim için özel delegate.

Bu araçlar miras yerine composition sağlar; sınıfları esnek tutar. Bir logger'ı delege etmek, yapılandırmayı ertelenmiş yüklemek veya yaş negatifliğini reddetmek gibi gerçek ihtiyaçları temiz tek satırlarla çözer. Hangi aracın uygun olduğuna iş gereksinimi karar verir.

Uygulama Sınıf delegasyonu ve by lazy birleştir

interface Greeter { fun greet(): String } tanımla. class EnglishGreeter : Greeter içinde override fun greet() = "Hello" yaz. class App(g: Greeter) : Greeter by g tanımla. val tag by lazy { "v1" } tanımla. main içinde val app = App(EnglishGreeter()) ve println("${app.greet()} $tag") çağır.

Başlangıç kodu

Main.kt
interface Greeter {
    fun greet(): String
}

class EnglishGreeter : Greeter {
    override fun greet() = "Hello"
}

// App sınıfını tanımla: Greeter delegesi g ile
// tag değişkenini lazy delegesi ile tanımla

fun main() {
    val app = App(EnglishGreeter())
    // greet ve tag ile yazdır
}

Örnek çözüm

Main.kt
interface Greeter {
    fun greet(): String
}

class EnglishGreeter : Greeter {
    override fun greet() = "Hello"
}

class App(g: Greeter) : Greeter by g

val tag by lazy { "v1" }

fun main() {
    val app = App(EnglishGreeter())
    println("${app.greet()} $tag")
}

Beklenen çıktı

Hello v1

Uygulama observable ile değişiklik izle

import kotlin.properties.Delegates ekle. var count by Delegates.observable(0) { _, _, new -> println("Yeni: $new") } tanımla. main içinde count = 1 ve count = 2 ata.

Başlangıç kodu

Main.kt
import kotlin.properties.Delegates

// count değişkenini observable delegesi ile tanımla

fun main() {
    // count'a 1 ve 2 ata
}

Örnek çözüm

Main.kt
import kotlin.properties.Delegates

var count by Delegates.observable(0) { _, _, new -> println("Yeni: $new") }

fun main() {
    count = 1
    count = 2
}

Beklenen çıktı

Yeni: 1
Yeni: 2

Soru ve cevaplar

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

1 Hangisi bir nesneye arayüz delegasyonu yapar?

  • by lazy
  • by (arayüz) Doğru cevap
  • by map
  • vetoable

Açıklama: by (arayüz) sınıf delegasyonu yapar.

2 delegasyon araçlarını eşle

Kavram Anlamı
by repo Sınıf delegasyonu
by lazy Erken hesaplama
by map Dinamik özellik
vetoable Doğrulama

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