OOP Okul Otomasyonu

Merhaba Arkadaşlar,

bugünkü konumuzda OOP ile WFA uygulamasın mini bir Sınıf otomasyonu gerçekleştireceğiz.
Özetle;

1.Listview lerimize Öğrenci ve Öğretmen ekleyeceğiz.
2.Yine farklı bir listview e Öğretmen seçerek sınıf oluşturacağız.

3.Öğrencileri seçerek Sınıfa ekleyeceğiz.
4. Seçili sınıftaki öğrencileri listbox da görüntüleyeceğiz.

Ekran görüntülerinde göstermek gerekirse projemiz tamamlandığında aşağıdaki gibi bir gösterim olacaktır.

Projemiz de  class library ile dll oluşturdum ve bu .dll wfa projesine referans gösterdim.
Classlarda abstract class ve abstract metot kullandım.

Aşağıdaki linkten code behind e ulaşabilirsiniz.

http://www.dosya.tc/server7/p0p9qi/Code.zip.html

 

C# Abstract Class Nedir?

Merhaba Arkadaşlar,

Abstact sözcüğünü soyut ya da özet olarak Türkçe’ye çevirebiliriz ancak teknik olarak devam edersek kendisinden kalıtım veren ancak new anahtar sözcüğüyle instance (örnek kopya) alınamayan sınıflardır diyebiliriz.

Aynı zamanda bir abstract sınıf içerisinde yine abstract sözcüğünü kullanarak metotlar oluşturabilir ve böylece abstract sınıfı tıpkı bir interface (arayüz) gibi kullanabiliriz.

Şimdi Visual Studio’yu açıyor ve C# programlama dilinde yeni bir Windows Form projesi oluşturuyoruz.Ardından
“kedi” adında bir abstract class oluşturuyoruz, daha sonra Abstact classımız tıpkı normal bir class niteliğinde olduğu için içerisine property ve metotlarımızı yazıyoruz:

Abstract sınıfımızı oluşturduktan sonra formumuzun load eventi (olayı) içerisinde new anahtar sözcüğüyle instance almaya
çalışıyor ve ortaya çıkan hatayı görüyoruz:

Visual Studio’nun bahsettiği gibi abstract olarak işaretli bir sınıftan instance alınamaz demiştik,ancak abstract class
başka bir sınıfa kalıtım verebilir.O yüzden “Tom” adında bir kedimiz olsun ve abstract olarak yazdığımız kedi sınıfından
kalıtım alsın:

Formumuza tekrar dönüyoruz ve “Tom” sınıfından instance alıyoruz:

Böylece abstract sınıftan kalıtım alan normal bir sınıftan instance alınabildiğini öğrenmiş oluyoruz

Abstact bir sınıfı interface gibi kullanmak için uyacağımız en önemli kural, sınıf içerisindeki hangi üyeyi interface
olarak kullanmak istiyorsak o üyenin başına mutlaka abstract sözcüğünü eklemek ve erişim tipini private olarak belirtmemek zorundayız.

Eğer bir abstract classı interface gibi kullanmaya karar verirseniz, sınıf içerisindeki metotların başına abstract sözcüğünü kullanacağınız için metotlarınız mutlaka ama mutlaka erişim belirteçlerinden (access modifiers – ileride göreceğiz) public (her yere açık şekilde) olarak tanımlanmak zorundadırlar.
Bunun yanı sıra abstract metotları virtual (sanal) olarak işaretleyemeyiz çünkü abstract sınıf kalıtım verme niteliğinde olduğu için zaten sanal yapıdadırlar.

Interface gibi kullanmak istediğimiz metotlar static (durağan) olarak belirtilemezler çünkü interface mantığında static kavramına yer yok. (Kalıtım veren dinamik yapıdadır her zaman)

Şimdi tekrar Visual Studio’ya geri dönüyor ve “köpek” adında yeni bir abstract class oluşturuyoruz.Bu sınıfımız
içerisindeki metotlara dikkat ederseniz tamamının başında abstract olduğunu ve interface konusunda öğrendiğimiz
gibi metodun içinin boş yalnızca gövdesinin olduğunu göreceksiniz:

Kopek sınıfımızdan Karabaş isimli köpeğimiz için “Karabaş ” adında bir sınıf oluşturuyor ve kopek sınıfından kalıtım alıyoruz:

Sanki normal bir interface’den kalıtım almış gibi sınıfımız üyeleri otomatik biçimde doluyor ve metotlarımızın içerisini
doldurmamız için metot içerikleri genişletiliyor.

Bir abstract class ile interface’den kalıtım almanın en önemli farkı şudur: kalıtım alacak sınıf birden çok interface’den
kalıtım alabiliyorken, interface gibi davranan abstract sınıflardan en çok bir kalıtım alabilmektedir.
Yani çoklu kalıtım almak istiyorsak her zaman interface’leri tercih etmeliyiz.

Abstact sınıfların bir başka özelliği ise bir abstract sınıf hem interface gibi hem de kalıtım vermeyen normal bir sınıf
gibi davranabilir.

eki nasıl oluyor?

Abstact bir sınıf içerisindeki metotlardan hangisinin başında abstract yazıyorsa o metot interface üyesi olarak varsayılırken başında abstract yazmayan metotlar normal bir sınıf üyesi gibi davranırlar ve doğal olarak interface gibi davranmasını istediğimiz metotlar yalnızca gövde yapısındayken normal metot yapısında çalışan metotların içine istediğimiz kodları yazabiliriz.

Gelelim pratik bir örneğe…

“Tavsan” adında bir abstract sınıf oluşturalım ve içerisine abstract olan “koş”, abstract olmayan “zıpla” isimli iki metot ve tipi (string,int) önemli olmayan abstract olan ve olmayan renk ve yaş property’leri ekleyelim:

Şimdi de “Pamuk” adında bir sınıf oluşturalım ve abstract olan tavşan sınıfımızdan kalıtım alalım:

Dikkat ederseniz kalıtım aldıktan sonra yalnızca interface gibi davranan “koş” metodumuzun gövdesi “Pamuk” isimli sınıfımızın içerisinde dolduruldu.Interace gibi davranmayan “zıpla” isimli metodumuz ise aslında bir yere kaybolmadı,arka planda bizi bekliyor.

“Pamuk” isimli metodumuzdan instance alıyoruz:

Gördüğünüz gibi soyut sınıfında oluşturduğumuz metotların ikiside geldi ancak aralarındaki tek fark; interface gibi davranan metodun ne yapacağı “normal” isimli metotta “Pamuk” isimli sınıfta  belirlenirken diğeri Abstract isimli sınıfımızda baştan belirlendi.