الگوریتم اول

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

شی‌گرایی (OOP) در #C

شی‌گرایی (Object-Oriented Programming یا OOP) یک پارادایم برنامه‌نویسی است که بر اساس مفاهیم اشیاء و کلاس‌ها استوار است. در #C، شی‌گرایی به‌طور کامل پشتیبانی می‌شود و می‌توان از آن برای سازماندهی کد و ایجاد برنامه‌های مقیاس‌پذیر و قابل نگهداری استفاده کرد.

شی‌گرایی در #C شامل چهار اصل اصلی است:

  1. کپسوله‌سازی (Encapsulation)
  2. وراثت (Inheritance)
  3. پوش polymorphism (پوش polymorphism)
  4. ابستراکسیون (Abstraction)

در ادامه، به تفصیل این اصول را بررسی می‌کنیم:

۱. کپسوله‌سازی (Encapsulation)

کپسوله‌سازی به معنی پنهان کردن جزئیات داخلی یک کلاس و فراهم کردن دسترسی به آن‌ها از طریق متدهای عمومی است. این کار باعث می‌شود که داده‌ها از دسترسی مستقیم به خارج از کلاس محافظت شوند و تنها از طریق متدهای تعریف‌شده تغییر پیدا کنند.

مثال کپسوله‌سازی

using System;

class Person
{
    // فیلد خصوصی
    private string name;

    // ویژگی عمومی برای دسترسی به فیلد خصوصی
    public string Name
    {
        get { return name; }
        set { name = value; }
    }

    // متد عمومی برای نمایش اطلاعات
    public void Greet()
    {
        Console.WriteLine("سلام، " + name);
    }
}

class Program
{
    static void Main()
    {
        // ایجاد شیء از کلاس Person
        Person person = new Person();
        
        // استفاده از ویژگی برای تنظیم مقدار
        person.Name = "علی";
        
        // استفاده از متد برای دسترسی به اطلاعات
        person.Greet();
    }
}

خروجی:

سلام، علی

در این مثال، فیلد name خصوصی است و برای دسترسی به آن از ویژگی (property) به نام Name استفاده می‌کنیم. این ویژگی به‌طور خودکار از روش‌های get و set برای خواندن و نوشتن استفاده می‌کند.

۲. وراثت (Inheritance)

وراثت این امکان را می‌دهد که یک کلاس جدید از یک کلاس دیگر ارث‌بری کند. کلاس جدید می‌تواند خصوصیات و رفتارهای کلاس پایه (پدر) را به ارث ببرد و در صورت نیاز آن‌ها را تغییر دهد.

مثال وراثت

using System;

class Animal
{
    public void Eat()
    {
        Console.WriteLine("جانور می‌خورد.");
    }
}

class Dog : Animal
{
    public void Bark()
    {
        Console.WriteLine("سگ پارس می‌کند.");
    }
}

class Program
{
    static void Main()
    {
        // ایجاد شیء از کلاس Dog
        Dog dog = new Dog();
        
        // استفاده از متد ارثی
        dog.Eat();
        
        // استفاده از متد خاص Dog
        dog.Bark();
    }
}

خروجی:

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

در این مثال، کلاس Dog از کلاس Animal ارث‌بری کرده و می‌تواند متد Eat را از آن به ارث ببرد. همچنین، متد خاص خود Bark را دارد.

۳. پوش polymorphism 

پوش polymorphism به این معنی است که اشیاء می‌توانند به روش‌های مختلف رفتار کنند، حتی اگر از یک نوع پایه (والد) باشند. این ویژگی امکان فراخوانی متدهای یکسان را در کلاس‌های مختلف فراهم می‌کند، به‌طوری‌که هر کلاس می‌تواند پیاده‌سازی خاص خود را از آن متد داشته باشد.

مثال پوش polymorphism

using System;

class Animal
{
    public virtual void MakeSound()
    {
        Console.WriteLine("جانور صدا می‌کند.");
    }
}

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

class Cat : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("گربه میو می‌کند.");
    }
}

class Program
{
    static void Main()
    {
        // ایجاد اشیاء از کلاس‌های مختلف
        Animal animal1 = new Dog();
        Animal animal2 = new Cat();

        // فراخوانی متد مشابه برای اشیاء مختلف
        animal1.MakeSound();
        animal2.MakeSound();
    }
}

خروجی:

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

در این مثال، متد MakeSound در کلاس‌های Dog و Cat به‌طور مختلف پیاده‌سازی شده است. با وجود اینکه نوع اشیاء animal1 و animal2 از نوع Animal است، اما به‌خاطر override کردن متد در هر کلاس، رفتار متفاوتی از آن‌ها انتظار می‌رود.

۴. ابستراکسیون (Abstraction)

ابستراکسیون به معنی پنهان کردن جزئیات پیاده‌سازی و فقط نمایش ویژگی‌های ضروری است. این کار به‌طور معمول با استفاده از کلاس‌های انتزاعی (abstract classes) و رابط‌ها (interfaces) انجام می‌شود.

مثال ابستراکسیون با کلاس انتزاعی

using System;

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

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

class Program
{
    static void Main()
    {
        // ایجاد شیء از کلاس Dog
        Dog dog = new Dog();
        dog.MakeSound();
    }
}

خروجی:

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

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

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

رابط‌ها مشابه کلاس‌های انتزاعی هستند اما نمی‌توانند پیاده‌سازی داشته باشند. در عوض، یک کلاس می‌تواند چندین رابط را پیاده‌سازی کند. رابط‌ها به ما اجازه می‌دهند که رفتارهای مختلفی را برای کلاس‌ها تعریف کنیم.

مثال رابط‌ها

using System;

interface IAnimal
{
    void MakeSound();
}

interface IWalkable
{
    void Walk();
}

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

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

class Program
{
    static void Main()
    {
        Dog dog = new Dog();
        dog.MakeSound();
        dog.Walk();
    }
}

خروجی:

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

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

جمع‌بندی

شی‌گرایی در #C اساساً بر چهار اصل پایه استوار است:

  1. کپسوله‌سازی که به پنهان‌سازی جزئیات پیاده‌سازی و ارائه یک API تمیز کمک می‌کند.
  2. وراثت که به ما اجازه می‌دهد تا کدهای مشترک را در کلاس‌های پایه تعریف کرده و در کلاس‌های فرزند استفاده کنیم.
  3. پوش polymorphism که به رفتارهای مختلف با استفاده از یک متد مشترک اجازه می‌دهد.
  4. ابستراکسیون که از پیاده‌سازی جزئیات جلوگیری کرده و تنها ویژگی‌های ضروری را نمایش می‌دهد.