C#-da açar sözlər(Keywords)|Part 2|Access Modifiers

Məhəmməd Sadıqzadə
Pragmatech
Published in
5 min readJul 28, 2021

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 :

Siniflər özləri avtomatik internal olduğu üçün açar sözü əlavə etməyə ehtiyac yoxdur

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 :

Tərcümə: “ ‘İnternalExample‘ öz qorunma səviyyəsinə görə əlçatılmazdır”

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 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 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ə Mainmetodu 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 :

Private olmasını istədiyimiz sinfin üzvlərinin önündə `private` yazmağa ehtiyac yoxdur,defolt halı elədir.

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?

TADAAA!

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!

--

--