Extension Functions 😎
Selamlar 👋, bugünkü yazımda bahsettiğim çok işlevli ve kullanışlı bir fonksiyon türüdür. Seveceğinize eminim. İyi okumalar. ✨
🔹Kotlin’ de üzerinde değişiklik yapılmasına izin verilmeyen bazı sınıflarımız bulunmaktadır. Bu sınıflar Primitive tipte de olabilmektedir. İşte üzerinde değişiklik yapılmasına izin verilmeyen sınıflara readOnly sınıflar denmektedir. Örneğin:
String sınıfı, Number sınıfı, Boolean sınıfı,.. gibi. (Ctrl ile üzerine gelip sağ tıklayarak ilgili sınıfa herhangi bir şey yazılamadığını test edebilirsiniz.)
🔹Peki Extension fonksiyonlar ne yapar?
Üzerinde değişiklik yapamadığımız(readOnly sınıflar) ya da yapmak istemediğimiz sınıflara, içerisine yazmadan yeni fonksiyon/fonksiyonlar ekleyerek sınıfın işlevselliğini genişletmemizi sağlar.
Receiver(alıcı) adlı bir sınıfa ihtiyaç duyar. Yani hangi sınıfa extension yazacağımızı ifade eder. (String, Number, Boolean,)
❗ ️❗ ️️NOT: Extension fonksiyonlarla o sınıfa üye bir fonksiyon kazandırmış oluruz. Ancak yazdığımız fonksiyon o sınıfın gerçek bir fonksiyonu olmaz.
Yapısı şu şekildedir:
🔹Extension fonksiyonlar değişkenler veya value’lar üzerinden de direkt çağrılabilmektedir.
🔹Extension fonksiyon özelliğine sahip olmayan dillerde bu nasıl gerçekleştiriliyor?
Oluşturduğumuz bir sınıfa yeni bir fonksiyon kazandırmak istediğimizde; fonksiyon için ayrıca bir sınıf oluşturup, bu sınıfı oluşturduğumuz sınıfa inherit ederek(miras vererek) fonksiyonu kullanabilir hale geliriz.
🔹Peki Extension fonksiyonları infix yapabilir miyiz?
Bir önceki yazımda bir fonksiyonun infix fonksiyon olabilmesi için gerekli şartlardan bahsetmiştim. Oradaki iki maddede şunlar yazıyordu:
- Bir sınıfa ait üye bir fonksiyon olmalıdır ya da Extension fonksiyon olmalıdır.
- Infix fonksiyonlar tek bir parametre içermelidir.
Sorumuzun cevabına gelecek olursak:
Evet, extension fonksiyonlar infix olabilir. Ancak extension fonksiyonlar infix fonksiyonlar gibi tek bir parametre değil birden fazla parametre de alabilmektedirler. Bu durumda yazdığımız her extension fonksiyon infix olmak zorunda değildir.
❗ ️❗ NOT: Extension fonksiyon bir sınıfın içerisinde yazıldıysa kullanım alanı sadece o sınıf içerisinde olur. Sınıf dışından çağırım yapılamaz. Eğer sınıf içerisinde yazılan extension fonksiyonu her yerde kullanmak istiyorsak o zaman extension fonksiyonu sınıf içerisinde değil de dosya içerisinde tanımlamamız gerekmektedir.
🔹Bir sınıf içerisinde yazılan extension fonksiyonla aynı isme sahip normal bir fonksiyon yazıldığında ve fonksiyon çağrımı yapıldığında:
[1] Normalde this belirttiğimizde class içerindeki üye fonksiyona gitmesi gerekiyordu. Çünkü this hangi class ya da interface içerisinde kullanılıyorsa onu işaret etmekteydi. Ancak yazdığımız fonksiyon bir extension fonksiyon olduğu için yani ilk baştaki log() fonksiyonu String sınıfına ait bir fonksiyon. Biz bu fonksiyon içerisinde this dediğimizde PrintMessage sınıfını değil de String sınıfını işaret etmektedir. Bundan dolayı this kullanıldığında extension fonksiyon içerisindeki log() fonksiyonu çağrılır.
🔹Bir sınıf içerisindeki fonksiyonla tıpa tıp aynı (aynı isimde, aynı parametre sayısında, aynı parametre tipinde, aynı geri dönüş tipinde) bir extension fonksiyon sınıf dışında yazıldığında ve çağrım yapıldığında sınıf içerisindeki fonksiyon gelir. Yazılan extension fonksiyon geçersiz sayılır.
🔹Open bir sınıf içerisinde open bir extension fonksiyon yazılırsa, bu sınıfı miras alan sınıflar bu extension fonksiyonu override edebilirler.
Bu yazınında sonuna gelmiş bulunmaktayız. Umarım faydalı olmuştur. (:
❗️ ❗️️ ❗️️ Bu bilgileri öğrenmemizi sağlayan Gökhan ÖZTÜRK ’e teşekkürü bir borç bilirim.