Abstract
Öncelikle abstract sınıf ve methodların anlatımına geçmeden önce kelime anlamına göz atalım. Abstract kelime anlamı itibariyle “Soyut”,”Soyutlandırma” anlamına gelmektedir. Sınıflar temel özelliklerin toplandığı kendisinden türetilen yani base olduğu sınıflara miras bırakan (özelliklerini aktaran) yapı demektir. Kendi üzerinden nesne türetimi yapamaz yani new anahtar kelimesiyle yeni bir kopya (instance) oluşturamazlar, soyutlandırma isim özelliğini de buradan almıştır. Abstract sınıflarının kullanımı daha çok bir çatı baz yapı oluşturmak içindir. Bu nedenle bu sınıfları kullandığımız senaryolarda sınıfın birden fazla durum için etkin rol oynaması gerekmektedir. Örneklememize geçmeden önce abstract sınıf yapı kurallarını inceleyelim.
Abstract sınıflar hakkında
• Abstract classlar abstract anatar sözcüğü kullanılarak oluşturulur.
1 2 3 4 5 6 7 |
public abstract class LogBase { } |
• Abstract class’lar erişim belirleyici olarak private, protected, private internal ile tanımlanamazlar.
• Abstract class’lar içinde abstract methodlar tanımlanabilir. Static method tanımlanamaz
• Abstract method’lar body içermezler. Sadece method tanımları yapılır ve mutlaka override edilmelidir.
• Abstract class’lar tanımlanırken sealed anahtar sözcüğünü kullanamayız. Sealed abstract ile ters mantıktadır ve classların miras bırakmaması için kullanılır.
• Abstract classlar içinde abstract methodları tanımlarken override anahtar sözcüğünü kullanamayız. Override sözcüğünün kullanımı abstract classların base olduğu class’lara method implementasyonu içindir.
• Abstract sınıflar içinde property tanımı yapabiliriz.
Bir örnekle abstract ‘ı pekiştirmeye çalışalım. Örneğimizde çok basit bir log yapısı kuracağız. Oluşturacağımız yapı dosya işlemleri ve sql CRUD(insert, update,delete) işlemlerinde log yazma olanağı sağlayacak. Log yapımızı abstract ile kurduğumuz için yönetimi, anlaşılabilirliği ve implementasyonu açısından kolaylık sağlayacak. Yeni bir ConsoleApplication oluşturuyoruz ve içine abstract sınıfımızı ekliyoruz.
LogBase.cs
1 2 3 4 5 6 7 8 9 10 11 12 |
namespace Bilisim.io { public abstract class LogBase { public abstract void WriteLog(); public abstract void WriteErrorLog(); } } |
Abstract sınıfımızı oluşturduk. WriteLog ve WriteErrorLog adında iki method var. Bu methodların ne iş yapacağına şimdi karar vereceğiz. Projemize iki sınıf daha ekliyoruz. SqlLog ve FileLog
SqlLog.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
namespace Bilisim.io { public class SqlLog : LogBase { public override void WriteLog() { Console.WriteLine("SqlLog yazıldı.."); } public override void WriteErrorLog() { Console.Write("Sql Error Log yazıldı."); } } } |
FileLog.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
using System; namespace Bilisim.io { public class FileLog : LogBase { public override void WriteLog() { Console.WriteLine("File Log yazıldı."); } public override void WriteErrorLog() { Console.WriteLine("File Error Log yazıldı."); } } } |
Abstact mirası
SqlLog ve FileLog sınıflarımız LogBase abstract sınıfından türetilmiştir ve üzerinden barındırdığı methodları miras bırakmıştır. public class SqlLog : LogBase tanımı SqlLog sınıfının LogBase üzerindeki değişkenlere ve methodlara implement olduğunu gösterir. Yukarıda görüldüğü gibi WriteLog ve WriteErrorLog methodları override anahtart kelimesi ise yeniden düzenlenmiş, methodlara işlemleri eklenmiştir. LogBase sınıfımızdaki tüm methodları mutlaka override etmemiz gerekmektedir aksi halde derleyici hata verecektir. Şimdi program.cs sınıfımında oluşturduğumuz yapıyı kullanalım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
using System; namespace Bilisim.io { class Program { static void Main(string[] args) { LogBase sqlLog = new SqlLog(); LogBase fileLog = new FileLog(); // Dosya işlemleri yapılıyor. try { // Dosya okuma yazma işlemleri yapıldığını varsayalım Console.WriteLine("*Dosya Okundu"); fileLog.WriteLog(); throw new Exception(); } catch (Exception) { // hata alındı fileLog.WriteErrorLog(); } // Sql CRUD işlemleri yapılıyor Try { // Sql İnsert İşlemleri yapıldığını varsayalım Console.WriteLine("*Sql Insert işlemi başarılı"); sqlLog.WriteLog(); throw new Exception(); } catch (Exception) { sqlLog.WriteErrorLog(); } Console.ReadKey(); } } } |
Yukarıdaki kod blogunda sql CRUD ve dosya işlemleri yaptığımızı varsaydık. İşlemlerde kullanacağımız log sınıflarını oluşturmak için aşağıdaki kodu kullandık. Comment haline getirilmiş kod şeklinde de instance alabiliriz. İki farkı şekilde de kullanılabilir. Kod içerisinde throw new Exception(); kodu ile ilgili işlemi yaparken hata aldığımızı varsaydık.
1 2 3 4 5 6 7 |
// SqlLog sqlLog = new SqlLog(); LogBase sqlLog = new SqlLog(); LogBase fileLog = new FileLog(); |
Oluşturduğumuz sqlLog ve fileLog sınıfları ilgili yerlerde implement oldukları methodları kullanarak farklı platformlarda log yazmamıza yardımcı olmuştur.
iyi çalışmalar,
H.Burak Karadağ