Bir önceki makalemde Virtual metod yapısından bahsetmiştim. Bu makalemde ise Abstract Class ve Metodlarından bahsedeceğim.
Abstract Class lar, sadece base class olarak davranmasını (yani inherit edilebilmesi) ve kendisinden instance çıkartılmamasını istediğimiz durumlarda kullanılır.
Resim-1
Abstract Classların en büyük özelliği, içerisinde Abstract olan yada olmayan metodları barındırabilmesidir. Abstract metodlar, kalıtım aldığı class ta implement edilerek kullanılacak metodlardır yani tanımlandığı yerlerde herhangi bir kod bloğu bulundurmazlar.
abstract class AbstractClass1
{
private void method()
{
// Kod bloğumuz
}
public abstract void AbstractMethod1();
public abstract void AbstractMethod2();
}
*Abstract metodlar sadece Abstract Class larda tanımlanabilirler.
Yukarda tanımladığımız AbstractClass1 classımızı biraz inceleyelim.
İçerisinde 3 adet metod bulundurmaktadır.
method = Abstract olmayan metod
AbstractMethod1 = Abstract metod
AbstractMethod2 = Abstract metod
Abstract Class içerisindeki Abstrac metodların gövdesi olamaz. Çünkü onlar sadece miras alındığı class larda implement edilebilir.
Abstract Class içerisinde tanımlanan abstract olmayan metodlar, normal classlarımızda tanımladığımız metodlarımız gibidir, bir farkı yoktur.
Ancak Abstract metodlarımıı tanımlarken aşağıdaki kurallara dikkat etmeliyiz.
- Abstract metodlar, private olarak tanımlanamazlar. Çünkü, private metodlar, miras alınan class lar tarafından implement edilemediklerinden dolayı, Abstract yapısına ters düşmektedir.
- Abstract metodlar, sadece Abstract classlar içerisinde tanımlanabilir.
- Abstract metodlar, Virtual olarak tanımlanamazlar. Virtual Classlar adlı makalemde anlattığım gibi, aslında her abstract class virtual dır. Abstract Class ın da amacı miras alındığı class ta implemente edilmek olduğu için Virtual yazıldığı takdirde hata alınacaktır.
- Abstract metodlar, Static olarak tanımlanamazlar. Statik kavramı, Class özelliği yada metodu olduğu için instance çıkarmaya gerek yoktur. Halbu ki, Statik olmayan metodlar, instance metodlarıdır. Abstract bir class ta, abstract olmayan static bir metod tanımlanabiliyorken, miras alındığı class ta implemente edilme zorunluluğu olduğundan, Abstract metodlar static olarak tanımlanamazlar.
- Abstrac metodların gövdesi olamaz. Çünkü onlar sadece miras alındığı class larda implement edilebilir.
Şimdi, bu kurallara uygun şekilde, yukardaki Abstract Classımızı ve Metodlarımızı oluşturduk. Aşağıdaki gibi başka bir class tarafından miras aldırtalım.
Resim-2
Zaten miras aldırdığımızda yukardaki gibi Implement abstract class ‘AbstractClass1’ uyarısı gelmektedir. İstersek buraya tıklayıp var olan tüm metodları implemente bir şekilde otomatik ekleriz, istersek kendimiz elle tek tek ekleriz. Fakat tekrar hatırlatmakta fayda var, Abstract Class ın içerisinde ne kadar abstract metod var ise, hepsini miras alınan sınıfta implemente etmek zorundayız. Aksi halde hata alırız.
Evet ben yukardaki uyarıya tıklayıp, tüm Abstract metodlarımızı implemente ediyorum.
class NormalClass : AbstractClass1
{
public override void AbstractMethod1()
{
throw new NotImplementedException();
}
public override void AbstractMethod2()
{
throw new NotImplementedException();
}
}
Görüldüğü gibi abstract metodlarımız overright bir şekilde gelmiştir.
Tanımlandığı yerde gövdesi olmayan metodlar, implement edildikleri yerde istediğimiz gibi kodlama yapabilmekteyiz.
Her miras alınan farklı class larda, bu metodlarımıza farklı işlemler yaptırabilmekteyiz.
Şimdi, Virtual Class adlı makalemde yapmış olduğum örneğinin aynısını Abstract Class ile de yapmak istiyorum. Dikdörtgen, Kare ve Çember gibi şekillerimizin Alan, Çevre uzunluğunu hesaplayacağız.
Hemen Class larımızı aşağıda belirtelim.
Abstract Classımız:
abstract class Hesaplamalar
{
public abstract void AlanHesapla(double deger1, double deger2);
public abstract void CevreHesapla(double deger1, double deger2);
}
Dikdörtgen, Kare ve Çember Classlarımız:
class Dikdortgen:Hesaplamalar
{
public override void AlanHesapla(double KisaKenar, double UzunKenar)
{
Console.WriteLine(“Diktörgen Alanı :” + KisaKenar * UzunKenar);
}
public override void CevreHesapla(double KisaKenar, double UzunKenar)
{
Console.WriteLine(“Dikdörtgen Çevere Uzunluğu :” + 2 * (KisaKenar + UzunKenar));
}
}
class Kare:Hesaplamalar
{
public override void AlanHesapla(double KenarUzunlugu, double deger2)
{
Console.WriteLine(“Kare Alanı :” + KenarUzunlugu * KenarUzunlugu);
}
public override void CevreHesapla(double KenarUzunlugu, double deger2)
{
Console.WriteLine(“Kare Çevre Uzunluğu :” + (4 * KenarUzunlugu));
}
}
class Cember:Hesaplamalar
{
public override void AlanHesapla(double YariCap, double Pi)
{
Console.WriteLine(“Çember Alanı :” + Pi * YariCap * YariCap);
}
public override void CevreHesapla(double YariCap, double Pi)
{
Console.WriteLine(“Çember Çevre Uzunluğu :” + 2 * Pi * YariCap);
}
}
Evet, classlarımızı tanımladık.
Hesaplamalar adında bir Abstract class oluşturduk ve içerisine AlanHesapla ve CevreHesapla adında 2 adet Abstract metod tanımladık.
Ardından:
Dikdörtgen, Kare ve Çember adında 3 adet class tanımladık ve Hesaplamalar classından türettik.
Daha sonra her bir classımız için Alan ve Çevre hesaplamalarını yukarda gördüğünüz gibi hesapladık :)
Şimdi gelelim sonuçlarımıza:
Kodlamamızı aşağıdaki gibi yapalım:
static void Main(string[] args)
{
Dikdortgen diktortgenHesapla = new Dikdortgen();
diktortgenHesapla.AlanHesapla(5, 4);
diktortgenHesapla.CevreHesapla(5, 4);
Console.WriteLine();
Kare KareHesapla = new Kare();
KareHesapla.AlanHesapla(5, 5);
KareHesapla.CevreHesapla(5, 5);
Console.WriteLine();
Cebmer CemberHesapla = new Cebmer();
CemberHesapla.AlanHesapla(5, Math.PI);
CemberHesapla.CevreHesapla(5, Math.PI);
Console.WriteLine();
Console.WriteLine(“*** İŞLEMİMİZ TAMAMLANMIŞTIR ***”);
}
Ve aldığımız sonuç aşağıdaki gibidir.
Resim-3
Görüldüğü gibi, Aynı metod, farklı classlar içerisinde farkı işlevler yapabilmektedir.
AlanHesapla ve CevreHesapla metodlarımız, 3 farklı metod içerisinde, farklı hesaplamalar yapmıştır.
Bu işlevi yapmamızı sağlayan Abstract Class ve metodlarımızdır.
Bu makalemde, Abstract Class ve Metodlarının ne anlama geldiğiniz, ne amaçla kullanıldıklarını ve kullanırken nerelere dikkat etmemiz gerektiğini anlatmaya çalıştım.
Bu konuyla ilgili sorularınızı alt kısımda bulunan yorumlar alanını kullanarak sorabilirsiniz.
Referanslar
Yaziniz cok guzel, abstract classlari ilk defa bu kadar anlayabildim. Makalelerinizin devamini dilerim :)