Abstract Kavramı

Öncelikle bu kavrama neden ihtiyaç duyarız, bize ne gibi avantajlar sağlıyor, bunları araştırmamız gerekir. Bunun için basit bir yapı kurarak işe başlayalım dedim. Bir tane ‘Personel’ isimli base classımız ve bundan türeyen ‘Uzman’ ve ‘Lider’ classlarımız olsun.Base classımızda bu iki sınıfın maaşlarını hesaplayan bir metodumuz olsun. Oluşturduğum yapının kodları aşağıdaki gibidir.


class Personel
 {
 public decimal Maas { get; set; }
 public decimal ZamOrani { get; set; }

public decimal MaasHesapla()
{
  return Maas + (Maas * ZamOrani);
 }
}

class Uzman : Personel { }

class Lider : Personel { }

Main metodu içinde Uzman ve Lider classlarından türeyen nesnelerimizin maaşlarını hesaplatalım.


static void Main(string[] args)
 {
  var uzman = new Uzman()
 {
   Maas = 100,
   ZamOrani = 0.25m
 };
 Console.WriteLine("Uzman Maaşı: {0}", uzman.MaasHesapla());

var lider= new Lider()
{
   Maas = 200,
   ZamOrani = 0.30m
 };
  Console.WriteLine("Lider maaşı: {0}", lider.MaasHesapla());
  Console.ReadKey();
}

Programı çalıştırdığımızda çıktı aşağıdaki gibi olacaktır.

capture1

Maaş hesaplamak için base classımızdaki ‘MaasHesapla()’ metodunu kullandık, Her birim için aynı tip maaş hesaplaması geçerli olsaydı bu bizim için gayet kullanışlı bir yapı olacaktı. Her birimin maaş hesaplama fonksiyonu olabilir ama fonksiyonların içerikleri farklı olabilir yani kendi içlerinde maaşlar farklı şekilde hesaplanabilir. Bu durumda ortak olan sadece MaasHesapla() metodu olup, gövde kısımları kendi child classlarımızda farklılık gösterecek. Bu durumu şu şekilde de aşabilirdik; base classımızdaki MaasHesapla() metodunu virtual yapıp, child classlarımızda (Uzman ve Lider) MaasHesapla() metodunu override edebiliriz bu şekilde yapmadan abstract yapısını kullanacağız.  Base classımız ve MaasHesapla() metodumuz abstract tipte tanımlayacağız. Böyle bir tanımlama yaparak artık base classlarımızdan türeyen her yeni child classımızda MaasHesapla() metodu zorunlu hale gelecek ve metodun gövde kısmını child classlarımızda yazacağız buda bize her child classımız için farklı bir yöntemle maaş hesaplama şansı tanayacak.Bir oop tasarımında, sınıf içerisinde abstract üyeler tanımlayarak, bu sınıftan türetilen sınıfları, tanımladığımız abstact üyelerin gövdelerini kodlamaya zorlayabiliriz. Yani örneğimizden yola çıkarsak eğer sen Personel clasından miras alan bir sınıf isen mutlaka bana MaasHesapla() metodunu sağlamak zorundasın demiş oluyoruz. Bu durumda yeni yapımız aşağıdaki gibi olacaktır. Maaş hesaplamasında farklılar oluşması için Uzman classımıza ‘prim’ alanı ekledim.

abstract class Personel
 {
 public decimal Maas { get; set; }
 public decimal ZamOrani { get; set; }

public abstract decimal MaasHesapla();
 }

class Uzman : Personel
 {
 public decimal Prim { get; set; }
 public override decimal MaasHesapla()
 {
 return Maas + Prim + (Maas*ZamOrani);
 }
 }

class Lider : Personel {
 
 public override decimal MaasHesapla()
 {
 return Maas + (Maas * ZamOrani);
 }
 }

Main metodu ve çıktı aşağıdaki gibi olacaktır.


class Program
 {
 static void Main(string[] args)
 {
 var uzman = new Uzman()
 {
 Maas = 100,
 ZamOrani = 0.25m,
 Prim=200
 };
 Console.WriteLine("Uzman Maaşı: {0}", uzman.MaasHesapla());

var lider= new Lider()
 {
 Maas = 350,
 ZamOrani = 0.30m
 };
 Console.WriteLine("Lider maaşı: {0}", lider.MaasHesapla());
 Console.ReadKey();
 }
 }

capture2

Konuyu özetlersek;

  1. Abstract sınıflardan nesne örneklenemez.
  2. Abstract bir sınıf hem abstract hem de abstract olmayan üyeler barındırabilir.
  3. Abstract üyelerin gövdeleri child sınıflarda kodlanmak zorundadır.
  4. Abstract sınıflar içerisinde abstract üyelerin gövdeleri kodlanamaz. Sadece tanımları yapılır.
  5. Abstract anahtar kelimesi hem metodlar için hem de classlar için kullanılabilir.
  6. Bir metodun abstract olarak işaretlenebilmesi için sınıfının da abstract olarak işaretlenmiş olması gerekmektedir.

Sealed Kavramı

Abstract yapısına değinmişken sealed kavramından da bahsetmek istedim.

  1. Sealed anahtar kelimesini sınıf adının yanına yazdığınızda artık o sınıftan başka sınıflar türetilemez.
  2. Eğer bir metod adının yanına yazılırsa o metod child sınıflarda override edilemez olacaktır.

Sealed yapılmak istenen metod ana sınıfın metodu ise sealed anahtar kelimesini kullanamazsınız. Çünkü zaten bunu yapmak için o metodu virtual ya da abstract yapmamanız yeterlidir.

İyi Çalışmalar.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir