Bu makalemde ise Abtract Class ve Metotlarından bahsedeceğim. AbstractClass lar, sadece base class olarak davranmasını (yani inherit edilebilmesi) ve kendisinden instance çıkartılmamasını istediğimiz durumlarda kullanılır.
Abstract Classların en büyük özelliği, içerisinde Abstract olan yada olmayan metodları barındırabilmesidir. Abstract metotlar, kalıtım aldığı class ta inplement edilerek kullanılacak metotlardı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 metot 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 metotlar, normal classlarımızda tanımladığımız metotları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 metotlar, 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 tnaı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 metotlar, instance metotları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 Metotlarımızı oluşturduk. Aşağıdaki gibi başka bir class tarafından miras aldırtalım.
Resim-1
Zaten miraz 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 metotları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 metotları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
Cebmer: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-2
Görüldüğü gibi, Aynı metot, farklı classlar içerisinde farkı işlevler yapabilmektedir.
AlanHesapla ve CevreHesapla metotlarımız, 3 farklı metot içerisinde, farklı hesaplamalar yapmıştır.
Bu işlevi yapmamızı sağlayan Abstract Class ve metotları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