C#-da açar sözlər(Keywords)|Part 2|Access Modifiers
Salam,bundan öncəki məqalədə C#-da açar sözlərin bir hissəsinə toxunmuşduq.İndi isə o məqalənin davamına,gəlin,göz ataq :)
Bundan əvvəlki “Modifier” açar sözlərə toxunmuşduq,indiki məqaləmizdə də elə “modifier” açar sözlərdən bəhs olunacaq.Lakin burdakılar “access modifier” — “Əlçatanlığı təyinedici” olacaq.Yəni digər siniflərdən sinfə və onun üzvlərinə əlçatanlığı bəlirləyən açar sözlərindən bəhs edəcəyik.
Əlçatanlığı təyin edən açar sözlər(Access modifiers)
public
internal
protected
private
public
Bir sinfin və ya sinfin bir üzvünün öz olduğu proyektin(assembly) hər yerindən və ya olduğu proyektin referansını alan digər proyektlərdən də çağrılmasını istəyiriksə,bunun üçün public açar sözündən istifadə edəcəyik :
Yuxarıdakı kodda public açar sözlü sinfə və onun eyni açar sözlü üzvünə eyni proyekt daxilində çatdığımızı görürük.Gəlin,indi fərqli bir proyektdən bu sinfə və üzvünə çatmağa çalışaq :
Bu tip sinfə və üzvə fərqli proyektdən də problemsiz əl çatmaq olduğunu gördük(namespace yanında olan ifadə proyektin adını təmsil edir).
Bonus
Bir proyekti referans almaq üçün using yanında proyektin adını yazmaq kifayət etmir.Proyektin “Dependecies” hissəsindən referans əlavə olunmalıdır :
“Dependecies” hissəsinin üstünə gəlirik
“Add Project Reference…” hissəsinə klikləyirik
Ardından açılan pəncərədə referansını istədiyimiz proyektin yanındakı boş xanaya klikləyib sonra “OK” butonu ilə işi bitiririk.
internal
Bu açar söz public açar sözündən sonra ən çox əlçatanlıq imkanı verən açar sözdür.Bu açar sözün işləndiyi sinfə və ya onun bu tipdə üzvlərinə public kimi bütün proyekt daxilində çatmaq mümkündür :
Lakin public açar sözündən fərqi odur ki,bu açar söz işlənən sinfə,dolayısı ilə onun üzvlərinə də (public olsalar belə) başqa proyektdən çatmaq mümkün deyil :
Həmçinin public olan bir sinfin içində internal üzvlər ola bilər :
Lakin onun internal üzvlərinə başqa proyektdəki siniflərdən çatmaq mümkün olmayacaq :
Təbii ki, “bu üzvlərə heç cür çatmaq mümkün deyil” deyə bilmərik.public metodlar,“property”-lər vasitəsilə çatmaq olar(Kapsullamaq texnikası məsələn),lakin birbaşa bu üzvə çatmaq mümkün deyil.
protected
Getdikcə əlçatanlığımızı biraz daha azaldırıq :) C# proqramlaşdırma dilində protected açar sözüylə təyin olunan üzvlərə öz sinfindən başqa yalnız təyin olunduğu sinfi miras alan siniflərdə çatmaq mümkündür :
Bu əlçatanlıq təkcə öz proyekti daxilində miras alan siniflər üçün keçərli deyil,həmçinin digər proyektdən də miras alan siniflər tərəfindən çağrıla bilər(Digər proyektdən çatmaq üçün miras verən sinif public olmalıdır) :
Bu üzvləri təyin olunduğu sinifi miras alan siniflərdən başqa yerdə çağırmaq mümkün deyil :
Yuxarıda üstündən keçdiyimiz public və internal açar sözlərini siniflər üzərində də işlətmişdik,lakin protected açar sözünü heç bu məqsədlə işlətmədik.Normal bir sinfin yanında protected yaza bilmərik,lakin proqramlaşdırmada İç-içə siniflər(ing :Nested classes) deyə anlayış var.Ətraflı araşdıra bilərsiniz,lakin burda qısa bir şəkildə göstərək :
Bu kodda OuterClass bizim yuxarıda public və internal açar sözləriylə də işlətdiyimiz sinifdir,lakin onu protected ilə yazmaq mümkün deyil,daxilindəki sinfi isə elə yazmaq mümkündür.Bu sistemdə InnerClass hər nə qədər bir sinif olsa da,o da age
kimi OuterClass sinfinin bir üzvü sayılır və üzvlərin defolt tipləri private olur,bu da bizə xaricdən çatmağa mane olur(Bu açar sözə ətraflı toxunacağıq,tələsməyin),ona görə də onu əvvəlcə internal edək və Main
metodu içində obyektini yaratmağa çalışaq :
Yuxarıdakı kodda InnerClass internal olduğu üçün onu miras almayan bir sinifdə( Program
) çağıra bildik,indi isə protected edək :
Miras alan bir sinifdə isə bu iç sinifi çağıra bilərik.
private
Bir sinif üzvünün öz sinfi daxilindən başqa heç bir yerdə birbaşa çağrılmamasını istəyiriksə,bunun üçün private açar sözündən istifadə edirik :
Sinfin daxilindəki setValueToId
metodu ilə private dəyişənə çata bildik.Lakin başqa sinifdən bunu etməyə çalışsaq,xəta alacağıq :
Yuxarıdakı şəkillərdən göründüyü kimi miras alan və ya almayan sinif fərq etmədən,heç bir sinif private üzvə birbaşa çata bilmir.
protected açar sözündə olduğu kimi private ilə də sinif təyin edə bilmərik.Amma iç-içə sinif məntiqində iç sinfi private ilə təyin etmək mümkündür.
Kompleks əlçatanlıq təyinləri
Əsas 4 əlçatanlıq təyin edicisini öyrəndik.Açar söz olaraq da yeni nəsə yoxdur,lakin yuxarıdakı açar sözlərin bəzilərinin birləşmələri ilə 2 kompleks təyin halı baş verir.Gəlin,bu birləşmələrə baxaq :
protected internal
private protected
protected internal
Yuxarıda öyrəndik ki,protected açar sözüylə təyin olunan dəyişəni yalnız öz daxilində və həmin sinfi miras alan siniflərdə çağırmaq olur.Həmçinin internal barədə də bildik ki,öz proyekti daxilində hər yerdən çağırmaq mümkündür.Bu ikisindən belə bir nəticəyə gələ bilərik :
protected internal açar sözü ilə təyin olunan sinif üzvünə öz proyekti daxilində hər yerdən və başqa proyektlərdə təyin olunduğu sinfi miras alan siniflər tərəfindən çatmaq mümkündür.
Yuxarıdakı kodda dəyişənin internal özəlliyindən faydalanaraq eyni proyekt daxilində miras almayan bir sinifdən çağıra bildik.İndi isə hörmətli protected açar sözünün faydasını dadaq :
Burda isə başqa bir proyektdəki bir sinifdə sinfi miras alaraq dəyişənə çatmış olduq.
Şəkildən də göründüyü kimi,əgər başqa proyektdə dəyişənin sinfini miras almayan bir sinif tərəfindən dəyişənə çatmağa çalışsaq,xəta alacağıq.
Normal bir sinif protected internal ola bilməz.
private protected
private protected ilə təyin olunmuş bir sinif üzvünə yalnız öz proyekti daxilində üzvün sinfini miras alan siniflər çata biləcək.
Bu da qısaca,protected açar sözünün təsir dairəsini azaldır deyə bilərik.“Yox axı,private açar sözünün təsir dairəsini genişlədir” də deyə bilərsiniz.Afərin,həmişə belə pozitiv olun :)
Mövzumuza dönərək dediyimizi praktikada tətbiq edək :
Eyni proyekt daxilində miras alan sinif problemsiz olaraq dəyişəni çağıra bildi.Bəs başqa proyektdə miras alan bir sinif?
Normal bir sinif private protected ola bilməz.
Bir əvvəlki məqaləmizin davamını yazmış olduq.Bu məqalədə “Access Modifiers ” deyə bilinən mövzunu izah etməyə çalışdım,ümid edirəm ki,yetərincə açıqlayıcı ola bildim.Gələcək məqalələrdə görüşənə qədər,xudahafiz!