by
- Kotlin kursu
- Orta seviye
- Ders 70/116
- 5 dk
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
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
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
class Service(logger: Logger) : Logger ____ logger
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 |