Kotlin'de super anahtar kelimesi, bir üst sınıfın veya uygulanan arayüzün metoduna veya özelliğine erişim sağlamak için kullanılır. Java'dan farklı olarak, Kotlin, bir metodun hangi arayüz veya sınıf üzerinden çağrılacağını açıkça belirtmeye olanak tanır; bu, aynı metodlara sahip birden fazla arayüzde "çakışma" durumunda özellikle önemlidir.
Özellik: Eğer bir sınıf, aynı imzaya sahip metodların tanımlandığı birden fazla arayüzü uyguluyorsa ve varsayılan bir uygulama varsa, hangi uygulamanın kullanılacağını açıkça belirtmek gerekir.
Örnek:
interface A { fun foo() = println("A") } interface B { fun foo() = println("B") } class C : A, B { override fun foo() { super<A>.foo() // Açıkça A.foo çağırıyoruz super<B>.foo() // Açıkça B.foo çağırıyoruz } }
Bu durum Java'da doğrudan desteklenmemektedir (Java, arayüzlerin metoda ait alanları/uygulamaları bulundurmasına Java 8'e kadar izin vermez ve Java 8'de bile mekanizmalar farklıdır).
"Kotlin'de bir üst sınıfın metoduna birkaç kalıtım seviyesi üzerinden erişmek mümkün mü?"
super<Intermediate>.foo() çağrılabileceğini düşünmektir, ama durum böyle değildir — yalnızca doğrudan üst sınıfa veya bu metodu doğrudan uygulayan arayüze erişilebilir.Örnek:
open class Base { open fun foo() = println("Base") } open class Mid : Base() { override fun foo() { println("Mid"); super.foo() } } class Child: Mid() { override fun foo() { super.foo() // Mid.foo() çağırır // super<Base>.foo() — derleme hatası } }
Hikaye
Büyük bir projede
LoggerveAuditorarayüzleri her ikisi derecord()metodunu tanımladı. Her iki arayüzü uygulayan bir sınıfın gerçekleştirilmesinde programcırecord()metodunu açıkça yeniden tanımlamadı ve sonuçta "Sınıf, public open fun record() metodunu yeniden geçersiz kılmalıdır" şeklinde derleme hatası alındı. Metodu manuel olarak uygulamak ve ilgili arayüze açıkça delege etmek zorunda kaldı.
Hikaye
Üst sınıfın uygulanmış metodunu birden fazla ara katman üzerinden çağırmaya çalışırken (örneğin,
super<Base>.foo()), derleme hatası meydana geldi. Geliştirici, Kotlin'in kısıtlamalarını bilmiyordu ve doğrudan çağrının neden mümkün olmadığını anlayamadı.
Hikaye
API'nın güncellenmesiyle, arayüzlerden biri, başka bir arayüz ile çakışan varsayılan bir metod uygulaması ekledi. Eski kod, çakışan uygulamalar nedeniyle artık derlenmedi — çakışmayı çözüme kavuşturmak için metodu kendisi uygulamaya ve hangi süper arayüzlerin uygulamalarının içinden çağrılacağını seçmeye zorlandı.