Altbilgi içeriğine atla
Iron Academy Logo
C# Öğrenin
C# Öğrenin

Diğer Kategoriler

C# Soyut Sınıfı Anlamak

C#'ta soyut sınıflar, geliştiriciler arasında sıklıkla soru işaretleri yaratan temel bir kavramdır. Tim Corey, 'C# Abstract Classes - What They Are, How to Use Them, and Best Practices' adlı videosunda soyut sınıfların ne olduğunu, nasıl kullanılacağını ve en iyi uygulamaları derinlemesine ele alıyor. Bu makale, referans olarak zaman damgaları kullanarak videosunun ana noktalarını özetlemektedir.

Giriş

Tim (0:00) soyut sınıfların amaçları, işlevsellikleri ve önemi konusunda sıklıkla sorgulandığını açıklar. Onları, işlevsellik açısından tam temel sınıf ile bir arayüz arasında yer almak olarak tanımlar.

Demo Uygulama Yürütümü

Saat (0:59), Tim soyut sınıfları göstermek için bir demo uygulamasını gözden geçirir. Uygulama, bir konsol uygulaması ve veritabanı işlemlerini simüle eden iki veri erişim sınıfı içeren bir sınıf kütüphanesinden oluşur. Bu sınıfların, soyut sınıflar, temel sınıflar ve arayüzler arasındaki benzerlikleri ve farkları göstermek için Tim'in kullandığı veri yükleme ve kaydetme yöntemleri bulunmaktadır.

İşte temel sınıf ve türetilen sınıfların başlangıç kodu:

// Base Class Definition
public class DataAccess
{
    // Method to load the connection string
    public string LoadConnectionString()
    {
        Console.WriteLine("Loading the connection string...");
        return "Test Connection String";
    }

    // Method to load data
    public void LoadData()
    {
        Console.WriteLine("Loading data...");
    }

    // Method to save data
    public void SaveData()
    {
        Console.WriteLine("Saving data...");
    }
}

// Derived class that inherits from DataAccess
public class SQLDataAccess : DataAccess
{
    // Overriding LoadData method to specify SQL data loading
    public new void LoadData()
    {
        Console.WriteLine("Loading SQL data...");
    }

    // Overriding SaveData method to specify SQL data saving
    public new void SaveData()
    {
        Console.WriteLine("Saving SQL data...");
    }
}

// Derived class that inherits from DataAccess
public class SQLiteDataAccess : DataAccess
{
    // Overriding LoadData method to specify SQLite data loading
    public new void LoadData()
    {
        Console.WriteLine("Loading SQLite data...");
    }

    // Overriding SaveData method to specify SQLite data saving
    public new void SaveData()
    {
        Console.WriteLine("Saving SQLite data...");
    }
}
// Base Class Definition
public class DataAccess
{
    // Method to load the connection string
    public string LoadConnectionString()
    {
        Console.WriteLine("Loading the connection string...");
        return "Test Connection String";
    }

    // Method to load data
    public void LoadData()
    {
        Console.WriteLine("Loading data...");
    }

    // Method to save data
    public void SaveData()
    {
        Console.WriteLine("Saving data...");
    }
}

// Derived class that inherits from DataAccess
public class SQLDataAccess : DataAccess
{
    // Overriding LoadData method to specify SQL data loading
    public new void LoadData()
    {
        Console.WriteLine("Loading SQL data...");
    }

    // Overriding SaveData method to specify SQL data saving
    public new void SaveData()
    {
        Console.WriteLine("Saving SQL data...");
    }
}

// Derived class that inherits from DataAccess
public class SQLiteDataAccess : DataAccess
{
    // Overriding LoadData method to specify SQLite data loading
    public new void LoadData()
    {
        Console.WriteLine("Loading SQLite data...");
    }

    // Overriding SaveData method to specify SQLite data saving
    public new void SaveData()
    {
        Console.WriteLine("Saving SQLite data...");
    }
}

Temel Sınıf Oluşturma

Tim saat (3:21)'de bir temel sınıf oluşturmayı açıklar. Kodun, LoadConnectionString gibi ortak yöntemleri DataAccess adlı bir temel sınıfa taşımak için nasıl düzenlendiğini açıklar. Bu temel sınıftan türetilerek, SQLDataAccess ve SQLiteDataAccess gibi diğer sınıflar, bu ortak yöntemlere erişim kazanır ve kod tekrarı azaltılır.

Temel Sınıfı Soyut Yapma

Tim saat (5:56)'da temel sınıfı bir soyut sınıfa dönüştürür ve farkları gösterir. DataAccess'ü bir soyut sınıfa dönüştürerek doğrudan örneklenmesini engeller. Bunun yerine, yalnızca SQLiteDataAccess ve SQLDataAccess gibi bu soyut sınıftan türeyen sınıflar, yöntemlerini uygulayabilir ve ortak işlevselliğini kullanabilir.

DataAccess soyut bir sınıf haline geldiğinde kod nasıl değişir:

// Abstract Base Class Definition
public abstract class AbstractDataAccess
{
    // Shared method to load connection string
    public string LoadConnectionString()
    {
        Console.WriteLine("Loading the connection string...");
        return "Test Connection String";
    }

    // Abstract methods that must be implemented by derived classes
    public abstract void LoadData();
    public abstract void SaveData();
}
// Abstract Base Class Definition
public abstract class AbstractDataAccess
{
    // Shared method to load connection string
    public string LoadConnectionString()
    {
        Console.WriteLine("Loading the connection string...");
        return "Test Connection String";
    }

    // Abstract methods that must be implemented by derived classes
    public abstract void LoadData();
    public abstract void SaveData();
}

Soyut Sınıfta Arayüz Bölümü

Tim saat (8:34)'de soyut sınıfların arayüzler ve temel sınıfların özelliklerini nasıl harmanladığını açıklar. public abstract void LoadData(); ve public abstract void SaveData(); gibi soyut yöntemler tanımlar, ancak uygulamaz. Bu, türetilmiş her sınıfın, arayüzlerin işleyişine benzer şekilde, bu yöntemleri uygulamasını sağlar.

Soyut Sınıflarda Yöntem Geçersiz Kılma

Tim saat (12:56)'da bir soyut sınıfta yöntemlerin nasıl geçersiz kılınacağını tartışır. virtual şeklinde temel sınıfta bir yöntem tanımlanabileceğini ve türetilen sınıfların bunu geçersiz kılmasına olanak tanıdığını gösterir. Bu yaklaşım, türetilen sınıflarda yöntemlerin nasıl uygulandığı ve genişletildiği konusunda esneklik sağlar.

Yöntem geçersiz kılmalarını gösteren türetilmiş sınıf kodu:

// Derived class from abstract base class
public class SQLDataAccessWithAbstract : AbstractDataAccess
{
    // Implementing the abstract LoadData method
    public override void LoadData()
    {
        Console.WriteLine("Loading SQL data...");
    }

    // Implementing the abstract SaveData method
    public override void SaveData()
    {
        Console.WriteLine("Saving SQL data...");
    }
}
// Derived class from abstract base class
public class SQLDataAccessWithAbstract : AbstractDataAccess
{
    // Implementing the abstract LoadData method
    public override void LoadData()
    {
        Console.WriteLine("Loading SQL data...");
    }

    // Implementing the abstract SaveData method
    public override void SaveData()
    {
        Console.WriteLine("Saving SQL data...");
    }
}

Soyut Sınıfların Ne Zaman Kullanılacağı

Tim saat (16:01)'de soyut sınıfların her gün kullanılmaması gerektiğini, ancak belirli senaryolarda değerli olduğunu belirtir. Sadece iki sınıf benzer koda sahip olduğu için soyut sınıfları kullanmaktan kaçınılmasını tavsiye eder. Bunun yerine "is a" (bir türdür) ilişkisini korumanın önemini vurgular ve ortak kod için uygun durumlarda yardımcı metotlar veya sınıflar kullanılmasını önerir.

İşte kullanımı gösteren ana program kodu:

// Main Program
class Program
{
    static void Main(string[] args)
    {
        // Using Base Class
        SQLDataAccess sqlData = new SQLDataAccess();
        Console.WriteLine(sqlData.LoadConnectionString());
        sqlData.LoadData();
        sqlData.SaveData();

        Console.WriteLine("--------------------------");

        // Using Derived Class from Abstract Base Class
        SQLDataAccessWithAbstract sqlDataAbstract = new SQLDataAccessWithAbstract();
        Console.WriteLine(sqlDataAbstract.LoadConnectionString());
        sqlDataAbstract.LoadData();
        sqlDataAbstract.SaveData();

        Console.WriteLine("--------------------------");

        // You can't instantiate Abstract Base Class directly
        // AbstractDataAccess abstractData = new AbstractDataAccess(); 
        // Error: Cannot create an instance of the abstract class
    }
}
// Main Program
class Program
{
    static void Main(string[] args)
    {
        // Using Base Class
        SQLDataAccess sqlData = new SQLDataAccess();
        Console.WriteLine(sqlData.LoadConnectionString());
        sqlData.LoadData();
        sqlData.SaveData();

        Console.WriteLine("--------------------------");

        // Using Derived Class from Abstract Base Class
        SQLDataAccessWithAbstract sqlDataAbstract = new SQLDataAccessWithAbstract();
        Console.WriteLine(sqlDataAbstract.LoadConnectionString());
        sqlDataAbstract.LoadData();
        sqlDataAbstract.SaveData();

        Console.WriteLine("--------------------------");

        // You can't instantiate Abstract Base Class directly
        // AbstractDataAccess abstractData = new AbstractDataAccess(); 
        // Error: Cannot create an instance of the abstract class
    }
}

Sonuç

Tim Corey'nin C# soyut sınıflar hakkında derinlemesine incelemesi, amaçlarını, işlevselliklerini ve gerçek dünya uygulamalarını anlamak için açık ve pratik bir görüş sunar. Demo uygulaması aracılığıyla soyut sınıfların, geliştiricilerin esnek ve sürdürülebilir kod yapıları oluşturmalarını sağlayarak temel sınıflar ile arayüzler arasında köprü kurduğunu gösterir.

Soyut sınıfları doğru senaryolarda kullanmak ve aşırı kullanımdan kaçınmak gibi en iyi uygulamalara önem vererek, Tim geliştiricilere bilinçli tasarım seçimleri yapmaları için araçlar sağlar. Bu kavramlara dair sağlam bir kavrayışla, geliştiriciler nesne tabanlı programlama becerilerini artırabilir ve sağlam C# uygulamaları inşa edebilir.

Hero Worlddot related to C# Soyut Sınıfı Anlamak
Hero Affiliate related to C# Soyut Sınıfı Anlamak

Sevdiğiniz Şeyleri Paylaşarak Daha Fazla Kazanın

.NET, C#, Java, Python veya Node.js üzerinde çalışan geliştiriciler için içerik oluşturuyor musunuz? Uzmanlığınızı ek gelire dönüştürün!

Iron Destek Ekibi

Haftanın 5 günü, 24 saat çevrimiçiyiz.
Sohbet
E-posta
Beni Ara