C# - Soyut Sınıf (Abstract Class)
Class (sınıf) yapısında "abstract" anahtar sözcüğü ile belirtilen "abstract class" (soyut sınıf) lar genellikle "base class" (temel sınıf) tanımlamak için kullanılmaktadır. Abstract class ların en önemli özelliği, bu class lardan nesne türetilemez.
Soyut bir sınıfa ihtiyaç duymadan da projelerinizi yapabilirsiniz, ancak bazı durumlar için bu sınıfları kullanmak çok işinize yarayacaktır. .NET framework ünde bile birçok yerde abstract class lar kullanılmıştır. Aslında bir nevi bunlara şablon görevi gören class lar diyebiliriz. Bu class lara mantıklı isimler vermeniz işlerinizi daha kolaylaştıracaktır. Çünkü projeniz büyüdükçe abstract class ları bir çok sınıf için kullanma gereği duyacaksınız.
Bu class lara neden soyut denmektedir ?
Bunun sebebi class ın üyelerinde "abstract" anahtar sözcüğü var ise kod bloğunun olmamasıdır. Sadece bunları kullanacak sınıflara kavramsal olarak yön vermeleridir.
Şunu da belirtelim ki bir abstract class ın tüm üyelerinde "abstract" anahtar sözcüğü olması şart değildir. Örneğin üyelerinde "virtual" anahtar sözcüğü de olabilir. Bu üyelerin içlerinde "abstract" ın aksine kod bloğu olması lazımdır. Aralarındaki temel başka bir fark da "abstract" üyelerin override edilme zorunluluğu varken, "virtual" da bu durum isteğe bağlıdır.
Aşağıdaki örneği inceleyelim..
using System;
namespace SoyutOrnek
{
class Program
{
static void Main(string[] args)
{
Liverpool liv = new Liverpool();
Juventus juve = new Juventus();
Console.WriteLine(liv.OnAd() + liv.Ad());
Console.WriteLine(liv.KurulusYili());
Console.WriteLine(juve.OnAd() + juve.Ad());
Console.WriteLine(juve.KurulusYili());
Console.ReadKey();
}
}
abstract class SporKulubu
{
public abstract string Ad();
public abstract int KurulusYili();
public virtual string OnAd()
{
return "FC ";
}
}
class Liverpool : SporKulubu
{
public override string Ad()
{
return "Liverpool";
}
public override int KurulusYili()
{
return 1892;
}
}
class Juventus : SporKulubu
{
public override string Ad()
{
return "Juventus";
}
public override int KurulusYili()
{
return 1897;
}
public override string OnAd()
{
return "";
}
}
}
Yukardaki örnekte "Liverpool" ve "Juventus" adında iki class tanımladık. Bunlar "SporKulubu" abstract class ından kalıtım aldılar. "SporKulubu" classının üyeleri görüldüğü üzere 2 abstract ve 1 virtual üyeden oluşmaktadır. "abstract" üyeler kalıtım sağlanacak classlarda override edilerek kullanılmasını istediğimiz üyelerdir. "virtual" üyenin kullanımını ise isteğe bağlıdır. Bu yüzden "Liverpool" class ında "override" etmemize gerek duymadan "default" (varsayılan) değeri ile kullanabileceğimizi düşündüğümüz için bu class ta "OnAd()" üyesini tanımlamaya gerek duymadık.
Ayrıca belirtmek isteriz ki bir abstract class ın tüm üyeleri doğası gereği "public" olmak zorunda yani dışarıya erişimi açık olmak zorundadır.
Eğer normal class lar için kalıtım (inheritance) konusunu biliyorsanız. İlk bakışta bir fark yok gibi görürsünüz. Bu class ın üyelerini aynı kalıtımdaki gibi kullanabilmekteyiz. Fakat "SporKulubu" class ı "abstract" anahtar sözcüğü ile yaratıldığı için bu sınftan bir nesne yaratamazsınız.
Aşağıdaki kodu "static void Main" içinde çalıştırın..
SporKulubu sporkulup = new SporKulubu();
Aşağıdaki derleyici hatasını alacaksınız:
- Cannot create an instance of the abstract class or interface 'AbstractClasses.SporKulubu'
Özetlemek gerekirse "abstract class" kalıtım sağladığı class lara nasıl olmaları gerektiğini anlatan yapılardır. Bir tür base class (temel sınıf) işlevi görür fakat neyi yapması zorunlu neyi yapması isteğe bağlı olduğunu anlatmaktadır.