İlginizi Çekebilir
C# Abstract Class Nedir?
  1. Ana Sayfa
  2. C#
  3. C# Abstract Class Nedir?

C# Abstract Class Nedir?

Nesneye yönelik programlamanın temel özelliklerinden birisi olan Soyutlama kavramını ele alacağımız bu içeriğimizde C# Abstract Class Nedir, Abstract Metot Nedir gibi sorulara cevap arayacağız.

Bu sorulara cevap ararken çıkacağımız yolda, teorik bilgilerin yanında örnekler ile bu terimlerin kullanımı hakkında bir fikir sahibi olmayı ve C# OOP Özellikleri içinde bulunan çetrefilli bir konuyu öğrenmiş olmayı hedefliyor olacağız. 🎯

C# Abstract Class Nedir?
C# Abstract Class (Soyutlama) Nedir?

C# Abstract Class Nedir?

Abstract Class, Nesneye yönelik programlamanın içerisindeki önemli kavramlardan bir tanesidir. Programlarımız içerisinde bulunan faaliyet öğelerini gizleyerek sadece sınıfın sahip olduğu işlevleri gösterir. Bu durum projemize esneklik, güvenlik ve hızlı kontrol yapısı sağlar.

C# Abstract Class Nedir sorusunu toparlayacak olursak, Abstract (Soyut) sınıfları kullanarak, nesne üretirken bir şablon oluşturmak istememizdir diyebiliriz. Yani bir sınıf üzerinde bulunan özellikleri kullanarak yeni bir sınıf türetmek istediğimiz zaman, içerisinde bulunan bazı temel yapıları yeniden oluşturmak için override (aşırı yükleme) işlemini uygular ve sınıf yapılarına göre özel bir hale getiririz.

Bir örnek senaryo üzerinden Abstract yapısını ele alırsak aklımızda daha sağlıklı ve sağlam bir şekilde yer edeceğini düşünmekteyim. Dünya’nın en büyük akıllı telefon üreten markalarını düşünelim. Hepsinin üretim aşamaları aynı şekilde ilerlemesine rağmen, telefon üzerinde kullandıkları mimari yapısı ve bileşenler aralarındaki farkları oluşturur. Bu senaryo içerisinde Akıllı telefonlar abstract sınıfları, akıllı telefon üretirken kullanılan yazılım, ekran, diğer mimari yapılar ise abstract metotları ve son olarak markalarda Abstract sınıfımızdan türetilen ana sınıflarımızı simgeler.

C# Abstract Class Kullanımı

C# Abstract Class Nedir sorusuna cevap bulduğumuza göre artık bu sınıf yapısını projelerimizde nasıl kullanacağımızı, kullanırken nelere dikkat etmemiz gerektiğini öğrenmeye başlayabiliriz.

Öncelikle bir soyut sınıf oluştururken dikkat etmemiz gereken noktalara birlikte göz atalım:

  • Bir abstract (soyut) sınıf oluşturuyorsak sınıf içerisinde muhakkak bir abstract metot, eğer bir abstract metot tanımlıyorsak muhakkak sınıf yapısının da abstract class olması gerekmektedir.
  • Abstract sınıf kullanılarak türetilen sınıf içerisindeki abstract metot yapısı override edilerek içerisinin doldurulması gerekir.

Dikkat etmemiz gereken ve uygulamamız gereken konular hakkında bir fikrimiz olduğuna göre bir soyut sınıf oluşturmamız için gereken kullanım şablonunu inceleyebiliriz.

namespace AbstractDemo
{
    abstract class AbstractClassManager //---> Abstract Class Tanımlaması.
    {
        public abstract void abstractMethod(); //---> Abstract Metot Tanımlaması.
    }
}

Abstract sınıfımızı yukarıdaki şablondaki gibi tanımladıktan sonra bu sınıfımızdan bir alt sınıf türeterek, abstract metodumuzu yeniden oluşturmamız gerekiyor. Bunu aklımızda kalacak basit bir örnek üzerinde işleyerek göstermek istiyorum.

Örnek üzerinde bir işletmemiz ve bu işletmeye bağlı çalışanlarımızın bilgilerinin yer alacağı, çeşitli işlemlere imkan verecek bir sınıfımız ve bu sınıfa özelliklerin atanmasını sağlayacağımız bir abstract class oluşturarak gerekli bilgilerini çıktısını kullanıcıya iletmek isteyelim. Bu örnek için uygulayacağım aşamalar şu şekildedir:

  1. Çalışan bilgilerinin tutulacağı base konumunda bir abstract class oluşturmak istediğimden dolayı EmployeBaseManager isminde bir abstract sınıf oluşturdum.
  2. Çalışanlarımın bilgilerini saklayacağım çeşitli değişkenler ve bu bilgilere göre çeşitli işlemler yapılmasını sağlayacağım bazı metot tanımlamaları gerçekleştirdim.
  3. Her çalışan kişinin zam oranı, yıllık izni gibi kavramlar çalışanın staatüsüne, deneyimine bağlı değişeceği için abstract metot olarak bazı metotlarında tanımlamasını gerçekleştirdim.Tanımlamaları gerçekleştirdikten sonra EmployeBaseManager sınıfımın içeriği bu hale geldi:
    namespace AbstractDemo
    {
        abstract class EmployeBaseManager
        {
          
            ///---> Çalışan Bilgilerin Saklanacağı Değişkenler <---\\\
            private string isim, soyisim, unvan;
            private double maas;
            private int yillikizin;
            ///---> Çalışan Kişilerin Bilgilerini Yazdıracağımız Metot Tanımlaması <---\\\
            private string ayrac = new string('-', 20);
            public void getInfo()
            {
                if (yillikizin > 0) ///---> Çalışan oluşturulurken yıllık izin belirtildiği için, çalışan oluşturulmadıysa bilgileri yazdırmayıp uyarı vermesini istiyorum.
                    Console.WriteLine("{0}\n<Abstract Company Employe>\n{1}\n-> İsim: {2}\n-> Soyisim: {3}\n-> Ünvan: {4}\n-> Maaş: {5} TL\n-> Yıllık İzin: {6}\n{7}", ayrac, ayrac, isim, soyisim, unvan, maas, yillikizin, ayrac);
                else
                    Console.WriteLine("{0}\n<Employe Not Found>\n{1}\n-> Sistem üzerinde getirmek istediğiniz kullanıcıların bilgisine erişemedim.\n{2}", ayrac, ayrac, ayrac);
            }
            public void setInfo(string isim, string soyisim,double maas)
            {
                if(isim.Length>=3 && soyisim.Length >= 2)
                {
                    if (maas > 2500)
                    {
                        this.isim = isim;
                        this.soyisim = soyisim;
                        this.maas = maas;
                        if (maas > 3000 && maas < 4000)
                        {
                            this.unvan = "Deneyimli " + unvan;
                            this.yillikizin = 20;
                        }
                        else if (maas > 4000 && maas < 5000)
                        {
                            this.unvan = "Kıdemli " + unvan;
                            this.yillikizin = 24;
                        }
                        else if (maas > 5000)
                        {
                            this.unvan = "Uzman " + unvan;
                            this.yillikizin = 30;
                        }
                        else
                            this.yillikizin = 14;
                    }
                    else
                        Console.WriteLine("{0}\n<ERROR BRO>\n{1}\n-> Çalışanlara minimum 2500 TL vermeniz gerekmektedir. Çalışan Oluşturulamadı.\n{2}", ayrac, ayrac, ayrac);
                }
                else
                    Console.WriteLine("{0}\n<ERROR BRO>\n{1}\n-> Çalışan isim uzunluğu ya da soy isim uzunluğu yeterli uzunlukta gözükmüyor.\n{2}", ayrac, ayrac, ayrac);
            }
            ///---> Maaş Bilgilerine Erişim Sağlayacağım Getter ve Setter Metot Tanımlamalarım <---\\\
            public double getMaas()
            {
                return maas;
            }
            public void setMaas(double maas)
            {
                this.maas = maas;
            }
    
            public void setUnvan(string unvan)
            {
                this.unvan = unvan;
            }
            ///---> Her Sınıf İçin Özel Zam Seçenekleri Olacağı İçin Abstract Metot Tanımlaması <---\\\
            public abstract void zamYap();
            public abstract void zamYap(double zamOrani);
        }
    }
  4. İşletme içerisinde beden işçisi statüsünde çalışan kişiler için EmployeManager isminde bir sınıf oluşturarak bu sınıfı kalıtım yolu ile üst sınıfını EmployeBaseManager seçerek içerisini dolduruyorum.
    namespace AbstractDemo
    {
        class EmployeManager : EmployeBaseManager
        {
            public EmployeManager()
            {
                setUnvan("Beden İşçisi");
            }
            public override void zamYap()
            {
                double maas = getMaas();
                double zam = maas + 50;
                setMaas(zam);
            }
            public override void zamYap(double zamOrani)
            {
                double maas = getMaas();
                double zam = maas + (maas * zamOrani);
                setMaas(zam);
            }
        }
    }
  5. Aynı işlemi mühendis statüsündeki çalışanlar içinde gerçekleştirmek için EngineerManager isminde bir sınıf oluşturdum ve İçerisindeki verileri güncelleyerek maaş zam oranlarını belirlemek için abstract metotları yeniden oluşturuyorum.
    namespace AbstractDemo
    {
        class EngineerManager : EmployeBaseManager
        {
           public EngineerManager()
            {
                setUnvan("Mühendis");
            }
            public override void zamYap()
            {
                double maas = getMaas();
                double zam = maas + 250;
                setMaas(zam);
            }
    
            public override void zamYap(double zamOrani)
            {
                double maas = getMaas();
                double zam = maas + (maas * zamOrani) + (maas%2);
                setMaas(zam);
            }
        }
    }
  6. Abstract yapısını daha doğru bir şekilde kullanmak ve programı esnek bir hale getirebilmek için CreateEmployeManager isminde ekleme işlemlerini yöneteceğim genel bir sınıf tanımlaması gerçekleştirdim ve gerekli tanımlamaları oluşturdum.
    namespace AbstractDemo
    {
        class CreateEmployeManager
        {
            public EmployeBaseManager employeBaseManager;
            private string ayrac = new string('-', 20);
            private string isim, soyisim;
            private double maas;
            public void create()
            {
                Console.Write("{0}\n<Create Employe Manager>\n{1}\n-> Çalışanın İsmi: ",ayrac,ayrac);
                isim = Console.ReadLine();
                Console.Write("-> Çalışanın Soyismi: ");
                soyisim = Console.ReadLine();
                Console.Write("-> Çalışanın Maaşı: ");
                maas = Convert.ToDouble(Console.ReadLine());
                Console.WriteLine(ayrac);
                employeBaseManager.setInfo(isim, soyisim, maas);
            }
            public void getInfo()
            {
                employeBaseManager.getInfo();
            }
            public void zamYap()
            {
                employeBaseManager.zamYap();
                Console.WriteLine("{0}\n<Zam Uygulandı>\n{1}\n-> Yeni Maaş: {2} TL\n{3}", ayrac, ayrac, employeBaseManager.getMaas(), ayrac);
            }
            public void zamYap(double zamOrani)
            {
                employeBaseManager.zamYap(zamOrani);
                Console.WriteLine("{0}\n<Zam Uygulandı>\n{1}\n-> Yeni Maaş: {2} TL\n{3}", ayrac, ayrac, employeBaseManager.getMaas(), ayrac);
    
            }
        }
    }
  7. İskelet yapımı oluşturduktan sonra Main sınıfıma giderek gerekli ekleme işlemlerini gerçekleştirdim.
    namespace AbstractDemo
    {
        class Main
        {
            static void Main(string[] args)
            {
                ///---> Beden İşçisi Oluşturalım <---\\\
                CreateEmployeManager mert = new CreateEmployeManager();
                mert.employeBaseManager = new EmployeManager();
                mert.create();
                mert.getInfo();
                ///---> Mühendis Oluşturalım <---\\\
                CreateEmployeManager mustafa = new CreateEmployeManager();
                mustafa.employeBaseManager = new EngineerManager();
                mustafa.create();
                mustafa.getInfo();
            }
        }
    }

Kod Çıktısı:

C# Abstract Class Nedir
C# Abstract Class Örneği

Abstract (Soyutlama) kavramına, daha detaylı bir göz gezdirmek isterseniz Microsoft tarafından hazırlanmış dokümantasyona buradan ulaşabilirsiniz.

Nesneye yönelik programlamanın temel özelliklerinden olan soyutlama kavramına, C# Abstract Class nedir sorusu ile cevap vermiş ve konu ile alakalı örnek çözmüş olduk. Eğer konu hakkında aklınıza takılan bir soru işareti ya da konu işleyişi hakkında bir öneriniz bulunuyorsa aşağıda bulunan yorum yap kısmından benimle iletişime geçebileceğinizi unutmayın. 👋🏻

Yorum Yap

Yazar Hakkında

Yazmayı, öğrenmeyi, öğrendiklerini paylaşmayı , kodlamayı ve günün birinde Yönetim Bilişim Sistemleri Uzmanı olmanın hayalini kuran birisiyim.

Yorum Yap