C# - da inner type anlayışı
Published: 2023-09-26 16:19:35

Class daxilində field və ya metod saxlayan proqramçı tərəfindən hazırlanan bir obyektdir. C#-ın class daxilində başqa bir class yaratma kimi bir özəlliyi də var. Bu kimi class-lar nested class adlanır. C#-ın bu xüsusiyyəti proqram tərtibatçılarına class-ları qruplaşdırmaq, class-a kənardan müdaxilənin qarşısını almaq və proqram kodunu daha oxunaqlı hala gətirmək kimi bir imkanı verir. Bu  OYP - Obyekt Yönlü Proqramlaşdırmada (OOP - Object Oriented Programming) kapsülləmə (encapsulation) adlanır. Bir növ, class-a yalnız özü ilə eyni kod blokunda olan class-ların bağlanması təmin olunur, başqa class nested class-ı görmür.

Nümunə:

```
class ParentClass
{
    public void Method1()
    {
        Console.WriteLine("Method 1 was called in parent class");
    }

    class ChildClass
    {
        public void Method2() 
        { 
            Console.WriteLine("Method 2 was called in child class");
        }
    }
}
```




İndi isə əsas ParentClass və ChildClass-ı Main metodunda istifadə edək.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nruc1snnol5aqrwtigzt.PNG)

Şəkildən göründüyü kimi 10-cu sətirdə proqramımız xəta ilə qarşılaşdı. Buna səbəb ParentClass-ın daxilindəki public olmayan bütün class-ları kapsülləməsi oldu. Bu bir növ kənardan ChildClass-a müdaxilənin qarşısın aldı. Tutaq ki, bizə belə bir tapşırıq qoyuldu ki, əsas proqramımızda ChildClass-ın Method2 metodunu çağıraq. Bunun üçün doğru üsul ParentClass-da bir metod yaradıb (məsələn: Method3), bu metod daxilində ChildClass-ın Method2 metodunu cağırmaq (yuxarıda dediyimiz kimi class daxilinə aldığı class-ın private olmayan bütün metodlarını görür) və ən sonda Main metodunda Method3 -ü çağırmaq olacaq.

```
class ParentClass
{
    public void Method1()
    {
        Console.WriteLine("Method 1 was called in parent class");
    }

    class ChildClass
    {
        public void Method2() 
        { 
            Console.WriteLine("Method 2 was called in child class");
        }
    }

    public void Method3()
    {
        ChildClass c = new ChildClass();
        c.Method2();
    }
}
```

```
namespace ConsoleApp2
{
    internal class Program
    {
        static void Main(string[] args)
        {
            ParentClass p =new ParentClass();
            p.Method1();

            p.Method3();    
        }
    }
}
```


Əgər nested class-ın bağlantı göstəricisin public olaraq qeyd etsək bu class-a proqramın bütün yerlərindən qoşula bilərik.

Nümunə:

```
class ParentClass
{
    public void Method1()
    {
        Console.WriteLine("Method 1 was called in parent class");
    }

    public class ChildClass
    {
        public void Method2() 
        { 
            Console.WriteLine("Method 2 was called in child class");
        }
    }
}
```

```
namespace ConsoleApp2
{
    internal class Program
    {
        static void Main(string[] args)
        {
            ParentClass p =new ParentClass();
            p.Method1();
            
            ParentClass.ChildClass c = new ParentClass.ChildClass();
            c.Method2();
        }
    }
}
```

Lakin bu üsul istifadə olunması tövsiyə edilməyən üsuldur. Çünki, əgər, nested class daxilində həssas məlumatlar saxlayarsa (məsələn: istifadəçi kodu) proqramın digər class-larından asanlıqla bu məlumatı əldə etmək və ya dəyişdirmək kimi proqram tətbiqinin boşluqları olar.