Bu konuya biraz daha devam etmeliyiz!
Şimdilik küçük notlar halinde devam edelim; belki sonra makaleleştirebiliriz de...
Bunu, bizim kodların bulunduğu paket/klasör ismimiz gibi düşünebiliriz. Her zaman en başta yer almak zorunda ve şu şekilde tanımlanmakta:
Alıntı ("denemelerim.d"):
>
> module DENEMELER;
>
> void main() {
> //...
> }
> ```
>
Eğer bunu ana dosyada kullanmazsanız varsayılan olarak ''**'module'** denemelerim;'' gibi tanımlanmış oluyor. Yok harici bir dosyada tanımlayacaksanız, dosya ve klasör ismi ile uyumlu olmak zorunda. Ayrıca doğal olarak Türkçe karakter içermemeli. Harici dosyayı çağırırken de konumuzla dolaylı ilişkili olan **'import'**'u kullanıyoruz. Bu başlığı en sona bırakalım.
* **public:**
Öncelikle, tek dosyadan oluşan her sınıf ve üyesi her zaman public (herkese açık) gibi davranıyor. Yani siz, bu ve ileride göreceğimiz erişim haklarını, tek dosyada kullanırken işler halde olduğunu göremeyebilirsiniz. Çünkü hepsi varsayılan isim alanı içerisinde kardeş kardeş yaşamayı tercih ediyorlar...:)
Belki makalenin tamamını okumamak için çok aceleci olabilirsiniz. Bu durumda D.ershane'deki Sarma Dersi (<http://ddili.org/ders/d/sarma.html>) ile devam edin...
D dilinde yazdıklarınız, aksi belirtilmediği müddetçe her zaman public, yani sözcük anlamıyla halka açık. Dolayısıyla kural ihlali olmadığı müddetçe her sınıfın/yapının üyesine erişebilirsiniz. Tabi kısıtlamalara gidilmezse. Bunlar modül seviyesinde ve içinde olmak üzere iki çeşitler:
* **I.package:**
Bildiğimiz gibi, **'import'** kullanarak derleme anında herhangi bir yerdeki, her hangi bir kodu, ana koda dahil edebiliriz. Ama bunlar ilk maddede kısaca değindiğimiz **'module'**'den dolayı ana isim alanı, yani main()'nin içinde bulunduğu bölgedeymiş gibi temsil edilmezler. Öyleyse her modül ayrı bir paket (klasör) içinde varlığını sürdürür. Örnekle açıklarsak, evim ve mahalle isminde 2 paketimiz (directory, dizin) olsun:
Alıntı ("evim/odam.d"):
>
>
> module evim.odam;
class ODA {
package auto koltuğum = "Yaylı";
auto kapısı = "Açık kahverengi, çelik kapı";
}
>
Farz edelim mahalleden, Ali'yi ziyaret etmek istiyorlar. Komşuları, bir patikadan geçip Aliler'in (Anadolu'da bazı yörelerde Aligiller de denir) olduğu eve gidecek. Kapıya kadar gelebilirler, çünkü kurucu işlev this()'de salona açılan ODA() tanımlanmış.
Alıntı ("mahalle/yollar.d"):
>
> module mahalle.yollar;
> import evim.odam;
>
> class YOL {
> auto patika = "Ali'nin evine giden en kestirme yol";
> ODA salonAligillerin;
>
> this() {
> salonAligillerin = new ODA();
> }
> }
> ```
üyedir
>
Ancak, biz mahalliler olarak ya da main() içindeki bir yönetici, Ali'nin evine erişebilsek de evin reisinin olduğu koltuğa hiç bir zaman oturamayız. Çünkü **'package'** ile işaretlenmiş. Yani ev içindekilere açık ama dışarıya değil. Oysa varsayılan olarak halka açık (public) olan kapıya erişebilir ve hakkında bilgi edinebiliriz:
auto ziyaretYolu = new YOL();
ziyaretYolu.salonAligillerin.kapısı.writeln; //...koltuğum.writeln; ile bitseydi 'not accessible' derleme hatası alırdık...
* **II.private:**
Şimdi de Ali'nin çalışmaOfisi olduğunu ve ondan başkasını giremeyeceği bir oda hayal edelim. Bunu kodlara dökmeye gerek yok çünkü işin içine başka nesneler gireceği için temsil etmesi zor olabilir. Ama bileceğimiz tek bir şey var: Eğer '**package**' yerine bu sefer '**private**' kullanırsak, aynı modül içinden başka bir sınıf (örn. class KİŞİ), herhangi bir tanımlanmış ('**new**' ile hafızada yer ayrılmış) ODA'ya erişse de özel (private) olarak tanımlanmış hiç bir üyesine erişemeyecektir. Çünkü bu, o sınıf içindekilerin erişebileceği nitelikte işaretlenmiştir. Öyleyse, modüller arasında yaptığımız kısıtlamayı modül içinde de yapabiliriz...
* **II.protected:**
* **shared:**
* **static:**
**Düzenleme Notu:** Bir daha ki sefer sarma'dan diğer nesne özelliklerine (bir kaçı hemen yukarıda) geçeceğiz. Ama hala sarma konusunu kendi çapımda bitirebilmiş değilim. Çünkü '**private**' ile '**protected**' arasında henüz bir fark göremiyorum...:)
**Ek Not ve Soru:** Ayrıca yukarıdaki nitelikleri enum'lar için de denediğimde geçersiz olduklarını gördüm. Bunun nedenini bilmiyorum, oysa enum'lar da bir sınıf içinde üye/nesne gibi davranması gerekiyordu! Şu örnekte neden public gibi davranır?
class Foo {
// private auto Bar = "isn't public";/*
private enum Bar = "is public";//*/
}
--
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]