ProgramlamaKıdemli Kotlin Geliştiricisi

Kotlin'de 'super' anahtar kelimesi nasıl çalışır ve Java'daki kullanımından neyle ayrılır? Birden fazla arayüz uygulandığında hangi durumlarda belirsizlik sorunları ortaya çıkar ve bunlar nasıl çözülür?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

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).

Kandırmaca Soru

"Kotlin'de bir üst sınıfın metoduna birkaç kalıtım seviyesi üzerinden erişmek mümkün mü?"

  • Yaygın bir hata: Ara sınıf üzerinden 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ı } }

Konuyla ilgili detayları bilmemekten kaynaklanan gerçek hata örnekleri


Hikaye

Büyük bir projede Logger ve Auditor arayüzleri her ikisi de record() 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ı.