Merhaba arkadaşlar ,
Mobilhanem.com sitesi için anlattığımız / yayınladığımız Kotlin Dersleri serimize kaldığımız yerden devam ediyoruz. Bir önceki dersimizde Constructor (Yapıcı) Metot yapısından bahsetmiştik. Bu dersimizde ise Kotlin’de erişim belirleyiciler ile devam edeceğiz.
Kotlin ders listemizi takip ediyorsanız önceki derslerimizde değişkenler, fonksiyonlar ve sınıf yapılarından bahsettik. Nasıl değişken tanımlanır, fonksiyon nasıl tanımlanır ve nasıl çağırılır , sınıf nedir ve bu sınıftan nesne nasıl oluşturulur, constructor nedir ve ne işe yarar bunları anlatmış ve örnekler vermiştik. Bu dersimizde ise bu yapıları nasıl kısıtlı hale getiririz onu anlatmaya çalışacağız. Kısıtlamak nedir diye sorarsanız şöyle açıklamaya çalışayım.
Örneğin bir sınıf yazdınız ve bu sınıfınızın içinde değişkenleriniz, constructor’ınız ve fonksiyonlarınız var. Ama içerdeki değişkenlere herkesin ulaşmasını , değiştirmesini ve ya fonksiyonları herkesin kullanmasını istemiyorsunuz. Bunu neden yapmak isteyim ki gibi bir düşünceniz varsa ilerleyen derslerde Encapsulation (Kapsülleme) anlatacağız. O derste çok daha iyi anlayacaksınız. Nesne yönelimli programlamanın 3 temel kuralından biri olan encapsulation için erişim belirleyiciler olmazsa olmazdır.
Erişim belirleyiciler:
Kotlin’de 4 adet erişim belirleyici vardır: public, private, protected, internal
Örnekli anlatımlara geçmeden önce aşağıda kısaca kim nelere ulaşıyor yazalım.
-
- public — Her yerden erişilebilir. public kelimesi halka açık anlamına gelmektedir. Bu erişim belirleyicisi ile tanımlanan her şey diğer bütün sınıflarlardan erişilebilinir. (Java ile aynı)
- private — Sadece tanımlandığı sınıftan erişilebilir. private özel veya gizli anlamına gelir. Bu erişim belirleyicisi ile tanımlanan herhangi bir eleman sadece ve sadece aynı sınıf içerisinden erişilebilir diğer sınıflar erişemez. (Java ile aynı)
- protected — Aynı sınıftan ya da o sınıftan türetilen sınıflar, nesneler tarafından erişilebilir. (Java’dan biraz daha farklı)
- internal —Aynı modül içindeki diğer sınıflar erişebilir. (Java’da yok)
Not: Eğer herhangi bir erişim belirleyici tanımlamazsak default olarak public olacaktır.
public fun test() { } fun test() { }
Yukarıdaki kod da her iki fonksiyonun erişim belirleyicisi public’tir. Bu yüzden public erişim belirleyicisi yazmaya gerek yoktur.
Erişim Belirleyiciler’le Örnekler:
Örnek 1:
class Test { public var x = 1 private var y = 9 protected var z = 0 internal var t = 5 } class Test2 { fun mobilhanem() { val testObj = Test() // Test class'ından bir object(nesne) oluşturuyoruz testObj.x = 12 testObj.y = 12 // hata (Can'not access 'y': it is private in Test ) testObj.z = 12 // hata (Can'not access 'z': it is protected in Test ) testObj.t = 12 } }
Test2 sınıfımızda ki mobilhanem fonksiyonu içinde öncelikle Test sınıfından bir nesne yarattık ve tek tek değişkenlerine ulaşmaya ve değiştirmeye çalıştık. x ile t değişkenine ulaşabilirken y ile z değişkenine ulaşamadık. Çünkü x değişkeni public ve herkese açık. t değişkeni internal ve bu iki sınıf (Test ve Test2) aynı modül içinde olduğu için ulaşabildik. y ise private başka bir sınıftan ulaşma şansımız yok. z ise protected sadece subclass’larından (türetilen) ulaşabiliriz.
Sadece değişken değil aynı şeyler fonksiyonlar için de geçerli.
Örnek 2:
class Test { fun publicFonksiyon() { // erişim belirleyicisi yazmadığı için public print("Public fonksiyon") } private fun privateFonksiyon() { print("Private fonksiyon") } protected fun protectedFonksiyon() { print("Protected fonksiyon") } internal fun internalFonksiyon(){ print("Internal fonksiyon") } } class Test2 { fun mobilhanem() { val testObj = Test() testObj.publicFonksiyon() testObj.privateFonksiyon() // hata testObj.protectedFonksiyon() //hata testObj.internalFonksiyon() } }
İlk örnekle birebir aynı diyebileceğimiz bir örnek. Farklı bir sınıftan public ve internal (aynı modülde oldukları için) fonksiyonlara ulaştık. private ve protected olanlara ise ulaşamadık.
Örnek 3:
open class Test { fun publicFonksiyon() { print("Public fonksiyon") } private fun privateFonksiyon() { print("Private fonksiyon") } protected fun protectedFonksiyon() { print("Protected fonksiyon") } internal fun internalFonksiyon(){ print("Internal fonksiyon") } } class Test2: Test() { // Test sınıfından Test2 sınıfını türetiyoruz. fun mobilhanem() { publicFonksiyon() privateFonksiyon() // hata protectedFonksiyon() internalFonksiyon() } }
Yukarıda ki örnekte Test2 sınıfı Test sınıfından türetildi. Türetmek ne demek derseniz bunu ilerleyen derslerde anlatacağız. Şimdilik bilmeniz gereken Test2 sınıfı Test sınıfından türetildi. Yani Test2, Test sınıfının alt sınıfıdır(subclass). Alt sınıf üst sınıfın protected değişken ve fonksiyonlarına ulaşabiliyor ama private olanlara ulaşamıyor. public ve internal’a ise zaten ulaşabiliyordu.
Örnek 4:
class Test { public fun publicFonksiyon() { print("Public fonksiyon") } private fun privateFonksiyon() { print("Private fonksiyon") } protected fun protectedFonksiyon() { print("Protected fonksiyon") } internal fun internalFonksiyon(){ print("Internal fonksiyon") } fun mobilhanem() { publicFonksiyon() privateFonksiyon() protectedFonksiyon() internalFonksiyon() } }
Yukarıda ki örnekte de aynı sınıf içinden private olsa bile değişken ve ya fonksiyona erişebildiğimizi görüyorsunuz. mobilhanem fonksiyonu içinde diğer fonksiyonlara hatasız ulaşabildik.
Bu dersimde sizlere Kotlin Erişim Belirleyiciler’i anlatmaya çalıştım. Bol örnekler vererek pekiştirdik. Bu örnekleri https://try.kotlinlang.org online ide ile deneyebilirsiniz. Bir sonraki dersimizde Nesne Yönelimli Programla’ya (OOP) giriş yapacağız. Umarım işinize yaramıştır.
Bir sonraki dersimde görüşmek dileğiyle …
73
eline sağlık hocam
Taha hocam eğitimler için teşekkür ederim. Lütfen bu seriye devam ediniz. internette sizden başka bu kadar açıklayıcı ve net anlatmıyor kimse. Allah sizden razı olsun üni hocalarımız başından savıyor geçiştiriyor işlemiyor bile bu konuları