C# Abstract Nedir?

Merhabalar. Bu makalemde C#’da Abstract Class‘ların ve Abstract Method‘ların ne olduğunu, nasıl kullanıldığını ve özelliklerini paylaşmaya çalışacağım.

Abstract Class:
Öncelikle “Abstract Class nedir?” sorusunu cevaplandıralım. Abstract Class, ortak özellikli Class’lara Base(taban) Class olma görevini üstlenir. Örneğin siz projenizde birden fazla Class oluşturup kullanmak istiyorsunuz. Ve oluşturacağınız Class’lar pek çok yönden ortak özellikleri içerisinde barındırıyor. İşte bu durumda Abstract Class kullanmanız kodunuzun daha sağlıklı olmasını sağlayacaktır.

Abstract Class’lar, diğer sınıflara base Class olmak için yazılır. Bu nedenle Abstract Class’dan nesne türetilemez. 
Abstract classlarda ortak olan ve ortak olmayan operasyonlar olabilir . Ortak Olmayan operasyonlar imza şeklinde yazılır(abstract keywordu ile ) bu abstract classı inherit eden class lar override olarak implemente eder.
Constructor yoktur.
Abstract class miras verilen class'ta ezilmesi gerekmektedir. Abstract class ile zorla tanımlama yapılma zorunda bırakılır.
Metodun içi miras alınan class'ta zorunlu doldurulur. 

Basit bir örnek olarak Cari classımız abstract 
Abstract class içinde abstract metot olabilir.
ParaCinsleri diye bir abstract metodumuz var gövdesi boş bir şekilde 
CariMusteri Cari base classında kalıtılıyor bu yüzden abstract yazan property leri zorunlu doldurtuyor.



Abstract Method:

İkinci iş olarak Abstract Method‘ların ne olduğunu açıklığa kavuşturalım. Abstract method, sadece Abstract Class’ların içerisinde tanımlanır ve Abstract Class’ı kalıtan sınıf tarafından override edilmek zorundadır. Oluşturduğumuz Abstract Class içerisine, Abstract Method yazılırken gövdesi yazılmaz ve daha sonra Abstract Class’ımızı kalıtacağımız sınıfta Abstract Method’u override ederiz.


  • Abstract Method, sadece Abstract Class’ların içerisinde tanımlanabilentanımlanırken gövde bulundurmayan, daha sonra içerisinde bulunduğu Abstract Class kalıtılırken override edilen Method‘lardır.
  • Abstract Method’lar, Private olarak tanımlanamaz.
Temel olarak Abstract Class ve Abstract Method’ları tanımlamaya çalıştım. 

Sıra geldi Abstract’ları bir örnekle pekiştirmeye. Ben bu örneğimi C# Console Application üzerinde yapacağım. Öncelikle senaryoyu anlatayım. Bizim Ucak adında bir tane Abstract(taban) sınıfımız olacak. Ve daha sonra bu Abstract Class’dan BuyukUcak ve KucukUcak sınıflarını kalıtacağız. Ve Ucak Abstract Class’ımızın içerisine basit bir “UcakFiyatı” isimli method yazıp, bu method’u kalıttığımız Class’larda override ederek, UcakFiyatı isimli methodumuza gövdeyi implement edeceğiz. 

Öncelikle “Ucak” Abstract Class’ımızı yazalım.

abstract class Ucak
{
public int YolcuKapasitesi { get; set; }
public string UcakSirketi { get; set; }
//Ucak’ların ortak Özellikleri’leri
public abstract void UcakFiyati();
//override edilecek abstract methodumuz
}

Gördüğünüz gibi Abstract Class’ımızda, sonradan oluşturulabilecek Ucak Class’larının ortak özellikleri ve bir tane override ederek gövdesini oluşturacağımız bir Abstract Method var.

//Büyük Uçak Sınıfı
class BuyukUcak : Ucak //Ucak Abstract Class’ından kalıtılan Class
{
public override void UcakFiyati() //Ucak Abstract Class’ından, Class kalıtırken override ettiğimiz, gövdesini doldurduğumuz method.
{
Console.WriteLine(“Büyük Uçağın Fiyatı 5m”);
Console.ReadLine();
}
}
//Küçük Uçak Sınıfı
class KucukUcak : Ucak
{
public override void UcakFiyati()
{
Console.WriteLine(“Küçük Uçağın Fiyatı 3m”);
Console.ReadLine();
}
}

Ucak Abstract Class’ından kalıttığımız BuyukUcak ve KucukUcak sınıflarında, UcakFiyati Abstract Method’unu override ederek gövdesini dolduruyoruz. İçerisine ise Büyük Uçağın ve Küçük Uçağın temsili fiyatlarını Console’a yazdırıyoruz.

static void Main(string[] args)
{
KucukUcak k = new KucukUcak();
k.UcakFiyati();
}
Son olarak ise Ucak Abstract sınıfından kalıtılan KucukUcak sınıfından oluşturduğumuz “k” nesnesini kullanarak UcakFiyati methodunu çalıştırıyoruz. Konsoldan gelen çıktı aşağıdaki gibi olacaktır.


Abstract ile interface arasındaki fark: Abstract ve interface programlamada kullanılan iki farklı ifade. Interface Türkçe arabirim anlamına gelir. Nesne yönelimli programlamada ise metot ve property listesidir. Abstract ise hem sınıflarda (class) hem de fonksiyonlarda kullanılan bir modifier’dır.
Bir class sadece bir tane abstract class inherit edebilir.
Bir class birden fazla interface inherit edebilir.
Bir abstract class kodun tamamını ya da yazılması gerekenin sadece detayını sunabilir.
Bir interface sadece imza sunar, herhangi bir kod sunamaz.
Bir abstract class sub’lar, fonksiyonlar ve property’ler için access modifier’lar içerebilir.
Bir interface sub’lar, fonksiyonlar ve property’ler için access modifier’lar içeremez. Herşey public kabul edilir.
İlgili sınıftaki metodu bulabilmek için daha çok zamana ihtiyaç duyar.

Abstract ile Interface Arasındaki Fark

Abstract ile interface arasındaki fark; Ferid Mövsümov blogunda çok kapsamlı ve detaylı bir şekilde yazılmış. Bu farkları aşağıda alıntıladım.

  1. Interfaceler çoklu kalıtımı sağlamaya yardımcı abstract classlar ise çoklu kalıtımı desteklemez.
  2. Interfacelerde metodların içerisini dolduramayız ama abstract classlarda doldurabiliriz Böylece bütün alt sınıfların belli bir özelliğe sahip olmasını sağlayabiliriz.
  3. Interface ile yapabildiğimiz herşeyi hatta daha fazlasını abstract classlar ile de yapabiliriz.
  4. Eğer türeteceğimiz classlarda belli başlı varsayılan özellikleri tekrar tekrar kopyala-yapıştır yapmak istemiyorsak o zaman abstract class kullanmamız gerekir. Çünkü abstract classlarla bir metodu tüm alt classlarda varsayılan metod şeklinde tanımlayabiliriz ve alt classlarda bunları tekrar yazmamıza gerek kalmaz kalıtımla aktarılmış olur.
  5. Kalıtım sağlamak istiyorsak abstract classlar kullanmamız gerekir.
  6. Abstract classları kullanmak hız açısından avantaj sağlar.
  7. Interface de yeni bir metod yazdığımız zaman bu interfaceden implement ettiğimiz tüm classlarda bu metodun içini tek tek doldurmak gerekiyor ancak abstract classlarda durum farklıdır burada bir metod tanımlayıp içini doldurduğumuzda abstract sınıfımızdan türetilmiş bütün sınıflar bu özelliği kazanmış olur.








Hiç yorum yok:

Yorum Gönder