مفهوم Polymorphism در شی گرایی

مفهوم Polymorphism در شی گرایی
فهرست مقاله [نمایش]

    Polymorphism یکی از مفاهیم کلیدی در برنامه‌نویسی شی‌گرا است. این کلمه از ترکیب دو واژه‌ی یونانی "poly" به معنای چند و "morph" به معنای شکل گرفته شده و به معنی "چندشکلی" است. در برنامه‌نویسی، Polymorphism به ما این امکان را می‌دهد که از یک کلاس یا رابط (interface) به شکل‌های مختلف استفاده کنیم و این توانایی را به کدهای خود بدهیم که از یک ساختار پایه برای اهداف متفاوت استفاده کنند.

    در این مقاله، با زبانی روان و ساده مفهوم Polymorphism را توضیح می‌دهیم و با ارائه مثال‌هایی کاربردی، به شما نشان می‌دهیم که چگونه از این اصل در برنامه‌نویسی شی‌گرا در سی‌ شارپ (#C) استفاده کنید.

    Polymorphism چیست؟

    در دنیای برنامه‌نویسی شی‌گرا، Polymorphism این امکان را به شما می‌دهد که از یک متد یا ویژگی (method or property) در چندین شکل مختلف استفاده کنید. به بیان دیگر، شما می‌توانید یک رابط یا کلاس پایه ایجاد کنید و سپس چندین کلاس مختلف بسازید که به شیوه‌های متفاوت این کلاس یا رابط پایه را پیاده‌سازی کنند.

    چرا Polymorphism اهمیت دارد؟

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

    به عنوان مثال، فرض کنید یک فروشگاه آنلاین دارید که سه روش پرداخت مختلف را پشتیبانی می‌کند: پرداخت آنلاین، پرداخت نقدی و پرداخت از طریق کارت هدیه. شما نمی‌خواهید برای هر روش پرداخت کد جداگانه‌ای بنویسید. با استفاده از Polymorphism، می‌توانید یک کلاس یا رابط پایه ایجاد کنید که هر سه روش پرداخت را پیاده‌سازی کند.

    پیاده‌سازی Polymorphism در سی‌ شارپ

    در سی‌ شارپ، Polymorphism از طریق رابط‌ها (interfaces) و وراثت (inheritance) قابل پیاده‌سازی است. در این بخش، با یک مثال ساده، این موضوع را توضیح می‌دهیم.

    مثال: پیاده‌سازی Polymorphism برای پرداخت‌ها

    ابتدا یک رابط (interface) برای روش‌های پرداخت مختلف ایجاد می‌کنیم:

    public interface IPaymentMethod
    {
        void Pay(double amount);
    }
    

    سپس دو کلاس برای روش‌های مختلف پرداخت ایجاد می‌کنیم: پرداخت آنلاین و پرداخت نقدی که هر دو کلاس از رابط IPaymentMethod استفاده می‌کنند:

    public class OnlinePayment : IPaymentMethod
    {
        public void Pay(double amount)
        {
            Console.WriteLine($"پرداخت آنلاین مبلغ {amount} ریال انجام شد.");
        }
    }
    
    public class CashPayment : IPaymentMethod
    {
        public void Pay(double amount)
        {
            Console.WriteLine($"پرداخت نقدی مبلغ {amount} ریال انجام شد.");
        }
    }
    

    در نهایت، می‌توانیم از هر دو روش پرداخت به سادگی استفاده کنیم:

    IPaymentMethod paymentMethod;
    
    // پرداخت آنلاین
    paymentMethod = new OnlinePayment();
    paymentMethod.Pay(10000);
    
    // پرداخت نقدی
    paymentMethod = new CashPayment();
    paymentMethod.Pay(10000);
    

    توضیح مثال:

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

    انواع Polymorphism در سی‌ شارپ

    Polymorphism در سی‌ شارپ به دو نوع اصلی تقسیم می‌شود:

    Polymorphism در زمان کامپایل (Compile-Time Polymorphism):

    این نوع Polymorphism از طریق بارگذاری بیش از حد متد (Method Overloading) و بارگذاری بیش از حد عملگرها (Operator Overloading) ایجاد می‌شود.
    در این حالت، متدها یا عملگرها با استفاده از پارامترهای مختلف و در زمان کامپایل تشخیص داده می‌شوند.

    Polymorphism در زمان اجرا (Run-Time Polymorphism):

    این نوع از طریق وراثت (inheritance) و رابط‌ها (interfaces) به دست می‌آید.
    با استفاده از این نوع Polymorphism، می‌توان رفتارهای مختلفی را برای اشیاء مختلف پیاده‌سازی کرد که در زمان اجرای برنامه مشخص می‌شود.
    مثال: Polymorphism در زمان کامپایل
    در این مثال، ما متدی به نام Add داریم که از بارگذاری بیش از حد (Overloading) استفاده می‌کند تا با پارامترهای مختلف کار کند:

    public class Calculator
    {
        public int Add(int a, int b)
        {
            return a + b;
        }
    
        public double Add(double a, double b)
        {
            return a + b;
        }
    }
    
    Calculator calc = new Calculator();
    Console.WriteLine(calc.Add(2, 3));     // خروجی: 5
    Console.WriteLine(calc.Add(2.5, 3.5)); // خروجی: 6.0
    

    در اینجا، متد Add هم برای اعداد صحیح و هم برای اعداد اعشاری تعریف شده و بسته به نوع پارامترهای ورودی، متد مناسب انتخاب می‌شود.

    کاربردهای Polymorphism در پروژه‌های واقعی

    1. سیستم‌های گرافیکی

    در برنامه‌های گرافیکی، مانند سیستم‌های رسم اشکال، ممکن است چندین نوع شکل مختلف مانند دایره، مربع، و مثلث وجود داشته باشد. هر شکل رفتار خاصی دارد، اما همه آن‌ها باید به نوعی رسم شوند. با استفاده از Polymorphism، می‌توانیم یک متد واحد برای رسم تمامی اشکال تعریف کنیم.

    public class Shape
    {
        public virtual void Draw()
        {
            Console.WriteLine("رسم یک شکل.");
        }
    }
    
    public class Circle : Shape
    {
        public override void Draw()
        {
            Console.WriteLine("رسم یک دایره.");
        }
    }
    
    public class Square : Shape
    {
        public override void Draw()
        {
            Console.WriteLine("رسم یک مربع.");
        }
    }
    
    Shape shape = new Circle();
    shape.Draw(); // خروجی: رسم یک دایره.
    
    shape = new Square();
    shape.Draw(); // خروجی: رسم یک مربع.
    

    2. سیستم‌های پلاگین

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

    public interface IPlugin
    {
        void Execute();
    }
    
    public class VideoPlugin : IPlugin
    {
        public void Execute()
        {
            Console.WriteLine("اجرای پلاگین ویدئو.");
        }
    }
    
    public class AudioPlugin : IPlugin
    {
        public void Execute()
        {
            Console.WriteLine("اجرای پلاگین صوتی.");
        }
    }
    
    IPlugin plugin = new VideoPlugin();
    plugin.Execute(); // خروجی: اجرای پلاگین ویدئو.
    
    plugin = new AudioPlugin();
    plugin.Execute(); // خروجی: اجرای پلاگین صوتی.
    

    نتیجه‌گیری

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

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

    اطلاعات نویسنده
    • نویسنده: تیم تحریریه باگتو

    ارسال دیدگاه

    برای افزودن دیدگاه خود، نیاز است ابتدا وارد حساب کاربری‌تان شوید


    دیدگاه کاربران