Kotlin'de davranış delege etme, sınıfın imzasında doğrudan by anahtar kelimesi ile gerçekleştirilen bir dil mekanizmasıdır. Bu, arayüzdeki (veya birden fazla arayüzdeki) yöntem çağrılarını başka bir nesneye, uygulanmasına otomatik olarak iletmekte, boilerplate’i azaltmakta ve kompozisyonu kolaylaştırmaktadır.
Arayüz delege etmenin ortaya çıkışı, çoklu mirasın sınırlamalarını ve dezavantajlarını ortadan kaldırma girişimidir. Bu, "inheritance yerine composition" fikridir – davranışı sınıf hiyerarşisine başvurmadan devrediyoruz. Kompozisyonun daha yaygın olduğu dillerden (örneğin; Go, Scala) ödünç alınmıştır.
Java ve diğer dillerde, genellikle bir arayüz oluşturmak ve her yöntemi manuel olarak uygulamak zorunda kalındığı için, hızla eskiyen bir yaklaşım. (Object Adapter deseni)
Kotlin, arayüzü by kullanarak deklaratif bir şekilde delege etme olanağı sunar:
interface Logger { fun log(msg: String) } class ConsoleLogger: Logger { override fun log(msg: String) = println(msg) } class Service(logger: Logger): Logger by logger { fun doWork() { log("İş başladı") // ... } } val service = Service(ConsoleLogger()) service.doWork()
Ana özellikler:
Service sınıfına aynı imzaya sahip kendi arayüz yöntemini eklerseniz ne olur?
Kendi uygulamanız "delege edilen" yöntemini "geçersiz kılar" – yani, sınıfta açıkça tanımlanan yöntem baskın gelir:
class Service(logger: Logger): Logger by logger { override fun log(msg: String) = println("ÖN EK: $msg") }
Bir sınıf, birden fazla arayüzü farklı nesnelere delege edebilir mi?
Evet, bir sınıf birden fazla arayüzü farklı nesnelere uygulayıp delege edebilir, ancak her arayüz bir nesneye delege edilir:
class Service( logger: Logger, tracker: Tracker ): Logger by logger, Tracker by tracker
Arayüz delege etme ile by kullanarak özellik delege etme arasındaki fark nedir?
Sınıf, arayüzü manuel olarak uyguluyor, her yöntemi delege çağırıyor, yeni yöntemler eklenince proxy güncellemeyi unutuyor, bu da hatalara yol açıyor.
Artılar:
Eksiler:
Dil delege etmesi kullanılıyor, yalnızca standart dışı yöntemler sınıf içinde uygulanıyor, yeni işlevsellik büyük değişiklikler olmadan ekleniyor.
Artılar:
Eksiler: