
Sınıflar alan(field),özellik(property) ve metot(method) yapılarından oluşan ve türetildiğinde anlamlı hale gelen yapılardır. Sınıf tanımları için daha detaylı bilgiyi önceki yazılarda yazmaya çalışmıştım. Şimdi ise iç içe sınıflar üzerinde duralım.
C# bir sınıfın içerisinde farklı bir sınıf tanımlamaya izin verir. Bu sınıflar nested class (iç içe sınıf) olarak tanımlanır.
- İç içe sınıflar, sınıfların mantıksal olarak gruplanmasını sağlar. Ortak iş yapan sınıfların bir arada bulunmasını sağlayabiliriz.
- Sınıf değişkenlerinin erişim belirleyicilerinin private olarak kalmasını sağlayarak daha iyi kapsülleme sağlar.
- İç içe sınıflar kod okunurluğunu arttırır.
NOT : İç içe sınıflar aynı şekilde interface(arayüz) için de geçerlidir.
Ana yapı şu şekilde oluşturulur;

Şimdi bir örnek üzerinden gidelim;

Yukarıda görüldüğü gibi sınıf yapısı oluşturduk. Daha sonra başka bir sınıf içerisinde bir örnek sınıf türettik.

Burada ilk olarak bir Driver sınıfı oluşturduk ve içerisinde oluşturduğumuz metot içinde Outer_class’tan bir obj1 nesnesi türettik. Bununla birlikte obj1’in içerisinde bulunan Result() metodunu çağırdık. Bu noktada eğer Inner_class’a obj1 ile ulaşmak istersek bu mümkün değildir.
Eğer Inner_class’a ulaşmak istiyorsak bu noktada yapmamız gereken Inner_class’ı public ya da internal olarak tanımlamak (iç sınıflar default olarak private’tır)ve daha sonra yeni bir nesne türetmek. Bunu da Outer_class.Inner_class ile yaparız. Nesne oluşturduktan sonra ise obj2.Result2() ile Inner_class içerisindeki metoda ulaşırız.
- İç içe sınıflar private, public, protected, internal, protected internal veya private protected olarak tanımlanabilir.
- Dış sınıf (Yukarıda Outer_class olarak tanımladık) direk olarak iç sınıfın üyelerine ulaşamaz.
- İç sınıf, dış sınıf içerisindeki static üyelere erişebilir. Aşağıda buna örnek göstereceğim.

İlk olarak Outer_class içerisinde bir static string değişken oluşturduk. Daha sonra Inner_class içerisinde oluşturduğumuz metot ile bu değişkeni Name içerisine atadık. Static olarak belirtmemizin sebebi sınıftan nesne türetmeden bu değişkeni kullanmak istememizdir. Aksi halde bu değişkeni kullanamayız.
Static olarak belirtmediğimiz bir Outer_class üyesine ulaşmak istersek aşağıdaki gibi Outer_class’tan yeni bir nesne türeterek ulaşırız.
Aşağıda buna bir örnek gösterebiliriz.

Inner_class’tan türettiğimiz bir nesne ile Outer_class içerisinde tanımlanan static olmayan bir üyeye ulaşabiliriz. Aşağıda bunu örnekleyelim.

- İç içe sınıfın scope’u onu çevreleyen sınıfın scope’u ile sınırlandırılmıştır.
- Default olarak iç içe sınıflar private’tır.
- C# ile , bir kullanıcı başka bir sınıfın içinde kalıtım alabilir. Yani bir adet sınıf tanımlayıp bu sınıfın içerisine bir iç sınıf tanımlayalım. Daha sonra bu iç sınıftan başka bir 2. sınıfta kalıtım alalım. Daha sonra 3. bir sınıf içerisinde, 1. sınıftan kalıtım aldığımız 2. sınıftan bir nesne türetelim. Aşağıda bunu örnek üzerinde görebilirsek bu tanımı daha iyi anlayacağız.

Genel itibariyle iç içe sınıfları bu şekilde tanımlayabiliriz. Belki arada kaçırdığım başlıklar veya eklenmesi gereken şeyler olabilir…