Türetme İşlemine Çeşitli Örnekler

Eğer yazmak istediğimiz sınıf zaten var olan bir sınıf özelliklerini gösteriyor ve fakat fazlalıkları da varsa türetme işlemi akla gelmelidir.
Bir işyerinde çalışan kişiler sınıflar ile temsil edilebilir. Çalışanın durumu ne olursa olsun onun bir ismi adresi telefonu vs vardır. Tüm bu bilgiler Employee isimli bir taban sınıfta toplanabilir ve sonra bu sınıftan türetmeler yapılabilir

Örnegin manager bir çeşit çalışandır ve Employee sınıfından türetilebilir.
Windows işletim sisteminde ekranda kontrol edilebilen dikdörtgensel bölgelere pencere deriz. Yuvarlak pencerelerde aslında bir dörtgen içindedir fakat sadeve yuvarlak kısmı boyandıgından biz öyle görürüz.
Program ana penceresi edit alanları, düğmeler, listeleme kutuları birer penceredir. Bunların hepsinin bir takım özellikleri ortaktır. Örn:
Hepsinin boyutu, genişlik yüksekliği, konum bilgisi, yazısı(görünebilr, görünmeyebilr) vardır…
İşte tüm pencerelerin ortak özellikleri bir “controll” sınıfında toplanmış ve bu sınıftan türetmeler yapılmıştır.

Görüldüğü gibi buton, check box, radio buton control sınıfına aittir.
Check box hem bir çeşit buton base dir hem de bir çeşit control dür.
List box ve combo box pencereleri de birbirine çok benzemektedir. Bunların da pek çok elemanları ortaktır. Bu ortak elemanlar list control sınıfında toplanmıştır. Örneğin bir çizim programı yazacak olalım ve bu çizim prog. da elips, dörtgen, çizgi gibi pek çok şekil çizilebilsin. Bu şekillerin ortak bir takım özellikleri vardır daha önce söylediğimiz gibi(konum, zemin rengi, çizgi rengi vs) işte bunların tüm bu ortak özellikleri shape gibi bir sınıfta toplanabilr ve diğer sınıflar bu sınıftan türetilebilir.

TÜRETME DURUMUNDA BALANGIÇ METODLARININ ÇAĞIRILMASI
Başlangıç metodlarının(constractor) amacı veri elemanlarına bir takım ilk değerleri vermektir. Türemiş sınıfın başlangıç metodu taban sınıfın elemanlarına ilk değerlerini veremez. İşte türemiş sınıf türünden bir nesne new operatörü ile yaratıldığında yalnızca türemiş sınıfın başlangıç metodu değil. Taban sınıfın başlangıç metodu da çağrılmaktadır. Örneğin;

Burada yalnızca B nin baslangıc metodu cagrilmaz hem B nin hem de Anın baslangic etodu cagrilir. Nesnenin B kısmına B nin baslangıc metodu A kısmına ise A nın kendi baslangıc metodu degerlerini vermektedir.
Nesne(4)
Class A
{
//…
}

Türemiş sınıf türünden bir nesne yaratıldıgında aslında derleyici yalnızca türemiş sınıfın baslangıc metodunu çağırır. Taban sınıfın başlangıc metodu türemiş sınıfın baslangıc metodu tarafından cagrılmaktadır. Yani “new B()” işleminde derleyici B nin baslangıc metodunu çagrır. B nin baslangıc metodu da A nın kini çağırmaktadır. Ayrıca derleyici türemiş sınıfın başlangıç metodunun ana bloğunun başına yerleştidiği gizli bir çağırma kodu yoluyla taban sınıfının baslangıc metodunu cagırmaktadır. Bu durumda önce taban sınıfın başlangıç metodu sonra türemiş sınıfın başlangıç metodunu çağırmış oluyoruz. Başlangıç metodlarının çalıştırılma sırası yukarıdan aşağıya doğrudur.
A <-- B<--C <--D ‘nin çalıştırılma sırası ABCD dir… Çağrılma sırası DCBA dır;) Bir dizi türetme yapıldıgında, başlangıç metodlarının çagırılma sırası yukarıdan aşagı doğrudur. Burada derleyici C nin baslangıç metodunu cagırır. C nin baslangıç metodu B nn baslangıc metodunu ve B nin baslangıc metodu ise A nın baslangıc metodunu cagırır. Bir sınıfın taban sınıfı denildiğinde onun tüm taban sınıfları anlasılır. Bir sınıfın doğrudan taban sınıfı (‘direct base class’) onun bir yukarısındaki taban sınıftır. Sınıfın dolaylı taban sınıfları (‘indirect base classes’) doğrudan taban sınıfının taban sınıflarıdır. Örneğin:

D’ nin doğrudan taban sınıfı C dir.
Dolaylı taban sınıfları B ve A dır.

TÜREMİŞ SINIFIN CONTRUCTOR’ U(BASLANGIC METODU) TABAN SINIFIN HANGİ BAŞLANGIC METODUNU ÇAGIRMAKTADIR?
İşte buna base sentax ınyla karar verilir. Türemiş sınıfın başlangıç metodunun kapanış parantezinden sonra ‘ :base(…) ‘ yazım şekliyle belirtilen baslangıc metodunu cagırır. Örneğin:

Burada base sentax ına uygun olan argüman listesine uygun olan baslangıc metodu cagrılır.
Türemiş sınıfın baslangıç metodunda :base() sentax ı hiç belirtilmeyebilir. Belirtmemekle :base() belirlemesi yapmak aynı anlamdadır. Yani hiç belirleme yapılmadıgında taban sınıfın default baslangıç metodu calıstırılır.
Türemiş sınıfın baslangıç metodunda base sentax ındaki argümanda türemiş sınıfın baslangıç metodunun parametreleri kullanılabilir.
Örneğin:

Ekran çıktısı:

Görüldüğü gibi her sınıf kendi doğrudan baslangıc metodunu cagırmaktadır.

Bir sınıfın çok fazla veri elemanı bulunuyor olabilir. Tüm bunları constructor dan alıp set etmemiz gerekmiyor sadece en önemlilerini constructor dan set ederiz diğerlerini propertyler ile set ederiz. Yani tüm veri elemanlarının baslangıc metodları ile set edilmesi hoş bir durum değildir örnegin 50 tane veri elemanı gibi.. bunları sadece en önemlilerini constructor ile set edilir. Eğer hepsi çok öenmliyse property ler ile hepsini alırız.
Burada doğru teknik en önemli birkaç degerin dısarıdan baslangıc yoluyla alınması digerlerinin property yoluyla set edilmesidir.
Şüphesiz base sentax ı yalnızca baslangıc metodlarında kullanılır. Hhb. Metodda kullanılamaz.

This Sentax:
Aslında bir sınıfın başlangıç metodunda ‘ : ’ den sonra ya this yada base sentax ı kullanılır fakat ikisi birlikte kullanılamaz.
Base sentax ı taban sınıfın baslangıç metodunu cagır anlamına gelirken, this sentax ı ise kendi sınıfının baslangıc metodunu cagır anlamına gelmektedir
Sınıfın baslangıc metodu normal bir metod gibi cagrılamaz. Ya new ya this yada base sentax ı ile cagılır. Eğer sınıfın pek çok baslangıc metodu varsa bu baslangıç metodlarında bazı ortak işlemler yapılıyorsa bu ortak işlemler bir baslangıç metodunda yapılabilir, digerleri bunu çağırabilir.
//…
Şekil (7)
//…
SYSTEM.OBJECT SINIFI
C# da her sınıf, doğrudan yada dolaylı olarak, System isim alanı içerisinde ki object sınıfından türetilmiştir. Biz bir sınıf için hiçbir türetme sentax ı kullanmasak dahi, derleyici o sınıfın System isim alanı içerisindeki object sınıfından türetildiğini varsayar.
Yani;

İle

Eşdeğerdir.
System.Object sınıfı object anahtar sözcüğüyle de karşılanmıştır. Yani ikisi de aynıdır.

Object sınıfının statik olan ve statik olmayan çeşitli methodları vardır. İleride bu metodlar üzerinde durulacaktır.

Yapıların türetme durumları
Yapılar türetmeye kapalıdır. Yani yapıdan türetme yapılamaz. Yapıda birşeyler türetilemez. Ancak durumun böyle olmasına karşın .Net’ te tüm sınıflar System.Object’ ten türetilmiştir. Fakat .Net’ ten tüm yapıların System isim alanındaki ValueType Sınıfından türetildiği varsayılmaktadır. Ancak programcı açıkca yapıyı System.Value type sınıfından türetemez.

Kaynak:Kaan Aslan Hocanın Dersinde Tuttuğum Ders Notlarıdır.

Leave a Reply

Site Footer