C Sharp Programlama Dili/İçiçe tipler ve erişim belirleyicileri

Vikikitap, özgür kütüphane

C# programlama dilinde tipler iç içe tanımlanabilir. Örneğin:

class A
{
    class B {}
}

Bu örnekte B sınıfı A sınıfının içinde bulunmaktadır. Bu türler iç içe geçmesine rağmen aslında birbirlerinden fiziksel olarak bağımsızdırlar. Yani üst sınıf türü nesne üzerinden alt sınıfın üye elemanlarına, alt sınıf türü nesne üzerinden üst sınıfın üye elemanlarına erişemeyiz. Alt sınıftan üst sınıfın statik ve statik olmayan üye elemanlarına erişebiliriz (private olanlar da dahil). Ancak statik olmayan üye elemanlara üst sınıf türünden nesne üzerinden erişebiliriz. Üst sınıf, alt sınıfın sadece public üye elemanlarına erişebilir. Benzer şekilde üst sınıf, alt sınıfın statik olmayan üye elemanlarına alt sınıf türünden nesne üzerinden erişebilir. C#'ta sınıfların içine başka sınıflar; sınıfların içine yapılar; yapıların içine başka yapılar; yapıların içine sınıflar; sınıfların ve yapıların içine arayüzler, temsilciler ve enumlar koyulabilir. Elbette ki arayüzler, temsilciler ve enumların bloğu olan üye elamanı olamadığı için bu türlerin içine başka türler konulamaz. Temsilciler konusu daha sonra işlenecektir. Ayrıca dış türlerin bir türün içindeki iç türe erişebilmesi için içerideki türün public olarak belirtilmesi gerekir. Bu durumda;

DisSinif.IcSinif nesne=new DisSinif.Icsinif();

notasyonunu kullanırız. Yani bir sınıfın içindeki başka bir sınıfa erişmek için DisSinif.IcSinif yazarız. Elbetteki burada IcSinif sınıfının public olarak belirtilmesi gerekir. Türler de üye elemanlar gibi erişim belirleyicisi alabilir. Türlerin alabileceği erişim belirleyicileri türün iç tür veya dış tür olmasına göre değişmektedir. Dış türler (başka bir türün içinde olmayan türler) sadece public ve internal erişim belirleyicilerini alabilir. internal varsayılandır ve ilgili türe sadece derlendiği program içinden erişilebilir. Örneğin ilgili türü bir DLL'e koyarsak türe erişebilmek için türün public olarak belirtilmesi gerekir. İç türlerin hangi erişim belirleyicileri alabilecekleri ise iç türün hangi dış tür içinde tanımlandığına bağlıdır. Bu bakımdan iç türlerin ilgili dış türün üye elemanlarından herhangi bir farkı yoktur. Dış türün üye elemanları hangi erişim belirleyicilerini alabiliyorsa ilgili iç tür de o erişim belirleyicilerini alabilir. Örneğin bir sınıfın içinde tanımlanan üye elemanlar ve iç türler public, protected, internal, private ve protected internal erişim belirleyicilerini alabilir. Bu erişim belirleyicilerin anlamları şöyledir:

  • public: İlgili üye eleman veya iç türe her yerden erişilebilir.
  • protected: İlgili üye elaman veya iç türü sadece ilgili üye eleman veya iç türün içinde bulunduğu sınıfı türeten sınıf ve yapılar kullanabilir.
  • internal: İlgili üye eleman veya iç türe program içinde her yerden erişilebilir.
  • private: İlgili üye eleman veya iç türe sadece o üye eleman veya iç tür içinde bulunduğu sınıf içinden erişilebilir (varsayılan).
  • protected internal: İlgili üye eleman veya iç türe program içinden her yerden erişilebileceği gibi program dışından ilgili üye eleman veya iç türün içinde bulunduğu sınıfı türetmek şartıyla da erişilebilir.

Bunlar sınıfların üye eleman ve iç türlerinin alabileceği erişim belirleyicileriydi. Yapıların üye elaman ve iç türleri sadece public, private ve internal erişim belirleyicilerini alabilirler. Çünkü yapılar türetilmeyi desteklemezler. Enumlar ve arayüzlerin üye elemanları ise erişim belirleyicisi alamazlar, içsel olarak zaten public'tirler.

NOT1: Yavru sınıf/yapı ana sınıftan daha erişilebilir olamaz. Örneğin ana sınıf internal iken yavru sınıf public olamaz.

NOT2: Bir sınıf, yapı veya arayüz uyguladığı arayüzlerden daha erişilebilir olamaz.

NOT3: Bir temsilci, geri dönüş tipi ve parametre tiplerinden daha erişilebilir olamaz (temsilciler daha sonra gösterilecektir).

NOT4: Bir metot, geri dönüş tipi ve parametre tiplerinden daha erişilebilir olamaz.

NOT5: Bir özellik veya sahte özellik geri dönüş tipinden daha erişilebilir olamaz.

NOT6: Bir olay, tipinden daha erişilebilir olamaz (olaylar ileride gösterilecektir).

NOT7: Bir indeksleyici, geri dönüş tipinden ve parametre tiplerinden daha erişilebilir olamaz.

NOT8: Bir operatör, geri dönüş tipi ve parametre tiplerinden daha erişilebilir olamaz.

İç içe tiplerde isim gizleme[değiştir]

Dış sınıfı türeten yavru sınıf dış sınıfın iç sınıfına isim gizleme yapabilir, bilinçli isim gizleme için new anahtar sözcüğü kullanılır. Bilinçli isim gizleme yapılmazsa derleyici uyarı verir (hata vermez). Ancak iç sınıflarda virtual ve override anahtar sözcükleri kullanılamaz.

Bu kitabın diğer sayfaları
  • Sınıflar
  • Operatör aşırı yükleme
  • İndeksleyiciler
  • Yapılar
  • Enum sabitleri
  • İsim alanları
  • System isim alanı
  • Temel I/O işlemleri
  • Temel string işlemleri
  • Kalıtım
  • Arayüzler
  • Partial (kısmi) tipler
  • İstisnai durum yakalama mekanizması
  • Temsilciler
  • Olaylar
  • Önişlemci komutları
  • Göstericiler
  • Assembly kavramı
  • Yansıma
  • Nitelikler
  • Örnekler
  • Şablon tipler
  • Koleksiyonlar
  • yield
  • Veri tabanı işlemleri
  • XML işlemleri
  • Form tabanlı uygulamalar
  • Visual Studio.NET
  • Çok kanallı uygulamalar
  • ASP.NET