الگوریتم اول

لطفا صبر کنید...

رابط‌ها و کلاس‌های انتزاعی در #C

رابط‌ها (Interfaces) و کلاس‌های انتزاعی (Abstract Classes) در #C

در #C، رابط‌ها (Interfaces) و کلاس‌های انتزاعی (Abstract Classes) ابزارهایی برای پیاده‌سازی ابستراکسیون (Abstraction) هستند. هر دوی این‌ها به ما اجازه می‌دهند تا برخی رفتارها را تعریف کنیم که در کلاس‌های فرزند باید پیاده‌سازی شوند. با این حال، تفاوت‌های مهمی بین رابط‌ها و کلاس‌های انتزاعی وجود دارد که در ادامه به آن‌ها پرداخته می‌شود.

۱. رابط‌ها (Interfaces)

رابط‌ها در #C ابزاری هستند برای تعریف قراردادها. وقتی یک کلاس یک رابط را پیاده‌سازی می‌کند، باید تمام متدها و ویژگی‌های مشخص‌شده در آن رابط را پیاده‌سازی کند. رابط‌ها در #C نمی‌توانند پیاده‌سازی داشته باشند، بلکه فقط می‌توانند امضاها و قراردادها را مشخص کنند.

ویژگی‌های رابط‌ها

  • یک رابط نمی‌تواند متغیرها (fields) داشته باشد.
  • تمامی اعضای رابط (متدها، خواص و رویدادها) باید عمومی باشند.
  • یک کلاس می‌تواند چندین رابط را پیاده‌سازی کند.
  • رابط‌ها می‌توانند فقط متدهای انتزاعی (بدون پیاده‌سازی) داشته باشند.

مثال از رابط‌ها

using System;

// تعریف یک رابط
interface IAnimal
{
    void MakeSound();  // متد بدون پیاده‌سازی
}

interface IWalkable
{
    void Walk();
}

// کلاس Dog که دو رابط را پیاده‌سازی می‌کند
class Dog : IAnimal, IWalkable
{
    public void MakeSound()
    {
        Console.WriteLine("سگ پارس می‌کند.");
    }

    public void Walk()
    {
        Console.WriteLine("سگ راه می‌رود.");
    }
}

class Program
{
    static void Main()
    {
        // ایجاد شیء از کلاس Dog
        Dog dog = new Dog();
        
        // فراخوانی متدهای پیاده‌سازی شده از رابط‌ها
        dog.MakeSound();
        dog.Walk();
    }
}

خروجی:

سگ پارس می‌کند.
سگ راه می‌رود.

در این مثال، کلاس Dog دو رابط IAnimal و IWalkable را پیاده‌سازی کرده است و متدهای مشخص‌شده در هر دو رابط را پیاده‌سازی کرده است.

۲. کلاس‌های انتزاعی (Abstract Classes)

کلاس‌های انتزاعی مشابه کلاس‌های عادی هستند، اما نمی‌توان از آن‌ها به طور مستقیم شیء ایجاد کرد. این کلاس‌ها برای تعریف رفتارهای مشترک بین کلاس‌های فرزند استفاده می‌شوند. در یک کلاس انتزاعی می‌توان هم متدهای انتزاعی (بدون پیاده‌سازی) و هم متدهای معمولی (با پیاده‌سازی) داشت.

ویژگی‌های کلاس‌های انتزاعی

  • کلاس‌های انتزاعی می‌توانند هم متدهای انتزاعی و هم متدهای با پیاده‌سازی داشته باشند.
  • کلاس‌های انتزاعی می‌توانند فیلدهای (متغیرها) داشته باشند.
  • یک کلاس تنها می‌تواند از یک کلاس انتزاعی ارث‌بری کند (در واقع وراثت از یک کلاس انتزاعی امکان‌پذیر است).
  • نمی‌توان از کلاس انتزاعی شیء ایجاد کرد، اما می‌توان از آن ارث‌بری کرد.

مثال از کلاس‌های انتزاعی

using System;

// تعریف یک کلاس انتزاعی
abstract class Animal
{
    // متد انتزاعی که باید در کلاس‌های فرزند پیاده‌سازی شود
    public abstract void MakeSound();
    
    // متد با پیاده‌سازی
    public void Eat()
    {
        Console.WriteLine("جانور می‌خورد.");
    }
}

// کلاس Dog که از کلاس Animal ارث‌بری می‌کند
class Dog : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("سگ پارس می‌کند.");
    }
}

class Program
{
    static void Main()
    {
        // ایجاد شیء از کلاس Dog
        Dog dog = new Dog();
        
        // فراخوانی متدهای مختلف
        dog.MakeSound();  // متد انتزاعی که در Dog پیاده‌سازی شده
        dog.Eat();        // متد با پیاده‌سازی از کلاس Animal
    }
}

خروجی:

سگ پارس می‌کند.
جانور می‌خورد.

در این مثال، کلاس Animal یک کلاس انتزاعی است که متد MakeSound را به صورت انتزاعی تعریف کرده است و باید در کلاس‌های فرزند پیاده‌سازی شود. همچنین، متد Eat پیاده‌سازی شده و در کلاس‌های فرزند به ارث می‌رسد.

تفاوت‌های اصلی بین رابط‌ها و کلاس‌های انتزاعی

ویژگی رابط‌ها (Interfaces) کلاس‌های انتزاعی (Abstract Classes)
تعداد وراثت یک کلاس می‌تواند چندین رابط را پیاده‌سازی کند. یک کلاس تنها می‌تواند از یک کلاس انتزاعی ارث‌بری کند.
اعضا فقط می‌توانند متدها، خواص و رویدادهای بدون پیاده‌سازی داشته باشند. می‌توانند متدهای پیاده‌سازی‌شده و متغیرهای نمونه داشته باشند.
پیاده‌سازی متدها هیچ‌کدام از متدها نمی‌توانند پیاده‌سازی داشته باشند. می‌توانند هم متدهای انتزاعی و هم متدهای با پیاده‌سازی داشته باشند.
چند وراثت از چندین رابط می‌توان به طور همزمان استفاده کرد. تنها یک کلاس انتزاعی می‌تواند به ارث برده شود.
محدودیت‌ها نمی‌توانند فیلدها (متغیرها) داشته باشند. می‌توانند فیلدها، ویژگی‌ها و حتی متدهایی با پیاده‌سازی داشته باشند.

 

چه زمانی از رابط‌ها و کلاس‌های انتزاعی استفاده کنیم؟

  1. رابط‌ها (Interfaces):

    • وقتی که نیاز دارید چندین رفتار مختلف را برای یک کلاس تعریف کنید که هیچ ارتباط خاصی با هم ندارند.
    • زمانی که می‌خواهید از چند وراثت استفاده کنید، چون یک کلاس می‌تواند چندین رابط را پیاده‌سازی کند.
    • هنگامی که نمی‌خواهید یا نمی‌توانید پیاده‌سازی متدها را فراهم کنید، بلکه فقط به امضای متدها نیاز دارید.
  2. کلاس‌های انتزاعی (Abstract Classes):

    • وقتی که نیاز به تعریف رفتار مشترک برای کلاس‌های فرزند دارید.
    • زمانی که نیاز به استفاده از پیاده‌سازی مشترک برای برخی از متدها و ویژگی‌ها دارید.
    • اگر می‌خواهید فیلدها یا مقداردهی اولیه را در کلاس انتزاعی ارائه کنید.

جمع‌بندی

  • رابط‌ها برای تعریف قراردادها و رفتارهایی هستند که کلاس‌ها باید پیاده‌سازی کنند. آنها به ما امکان می‌دهند که چندین رفتار مختلف را برای یک کلاس تعریف کنیم.
  • کلاس‌های انتزاعی برای تعریف رفتارهای مشترک و پیاده‌سازی بخش‌هایی از یک رفتار هستند. آنها به ما امکان می‌دهند که برخی متدها را پیاده‌سازی کنیم و برخی دیگر را به کلاس‌های فرزند واگذار کنیم.