معنی پلیمرفیزم و نحوه پیاده سازی آن در کد سی شارپ را در کمتر از پانصد کلمه یادبگیرید.

چندشکلی(Polymorphism) مفهومی مرتبط با برنامه نویسی شی گرا است. اصطلاحی فانتزی در واقع فقط به معنای چیزی است که چندین شکل دارد.

در اینجا یک قیاس وجود دارد که ممکن است کمک کند. در این مواقع خود را در نظر بگیرید:

- صرف شام عاشقانه با همسرتان

- تفریح با دوستانتان

- دیدار با پدربزرگ و مادربزرگتان

شما به احتمال زیاد «شکل‌های» متفاوتی از صحبت کردن و عمل کردن در همه این موقعیت‌ها دارید. همین مورد را می توان برای انواع (یا کلاس ها) در زبان های برنامه نویسی اعمال کرد!

سی شارپ با چند شکلی

بیایید با مثالی شروع کنیم که در آن از چندشکلی به طور کامل استفاده نمی کنیم.

ما در حال ساختن کامپیوترها و مدل سازی اجزا به عنوان کلاس هستیم. ما کلاس پایه کامپوننت و سه نوع کامپوننت مختلف داریم.

class Component { }

class Processor : Component
{
    public void Start()
    {
        Console.WriteLine("Software instruction can now be executed.");
    }
}

class GraphicsCard : Component
{
    public void Start()
    {
        Console.WriteLine("Graphics can now be rendered to the screen.");
    }
}

class HardDrive : Component
{
    public void Start()
    {
        Console.WriteLine("Information can now be stored to disk.");
    }
}

در مرحله بعد ما در واقع از چندشکلی استفاده می کنیم که همه نمونه های زیرنوع جزء را در یک آرایه واحد ذخیره می کنیم.

در یک برنامه کامل ممکن است انواع مؤلفه های زیادی وجود داشته باشد و ما همچنان می توانیم آنها را در همان آرایه ذخیره کنیم. با توجه به اینکه از همون کلاس پایه ارث میبرن البته!

بیایید چند نمونه از این مؤلفه ها ایجاد کنیم و آنها را در یک آرایه ذخیره کنیم.

var cpu = new Processor();
var gpu = new GraphicsCard();
var hardDrive = new HardDrive();

Component[] components = new Component[] { cpu, gpu, hardDrive };

اکنون باید کامپیوتر خود را آزمایش کرده و همه این اجزا را راه اندازی کنیم. باید نوع حلقه را مشخص کنیم تا به درستی آن را تبدیل کرده و متد Start را فراخوانی کنیم.

این قسمت بعداً با استفاده کامل از پلی مورفیسم بسیار ساده تر می شود!

foreach (var component in components)
{
    switch (component.GetType().ToString())
    {
        case "Processor":
            var cpuComponent = (Processor)component;
            cpuComponent.Start();
            break;
        case "GraphicsCard":
            var gpuComponent = (GraphicsCard)component;
            gpuComponent.Start();
            break;
        case "HardDrive":
            var hardDriveComponent = (HardDrive)component;
            hardDriveComponent.Start();
            break;
        default:
            break;
    }
}

پس از اجرای برنامه، با نگاه کردن به کنسول، می توانیم تأیید کنیم که متد Start صحیح فراخوانی شده اند.

Software instruction can now be executed.
Graphics can now be rendered to the screen.
Information can now be stored to disk.

پیاده سازی به صورت کامل با چندشکلی

اگر از متدهای مجازی(Virtual method) ارائه شده در سی شارپ استفاده کنیم، می‌توانیم نتیجه مشابه را راحت‌تر به دست آوریم. این متدها بسیار قدرتمند برای پیاده سازی پلی مورفیسم در سی شارپ است.

کلاس پایه باید یک متد مجازی داشته باشد که کلاس های فرزند بتوانند آن را لغو(Override) کنند. روش مجازی می تواند عملکردی داشته باشد، اما همچنین می تواند خالی باشد.

پیاده سازی در کلاس پایه (کلاس والد) را می توان با کلمه کلیدی  Base فراخوانی کرد.

class Component
{
    public virtual void Start()
    {
        Console.Write($"{GetType()} was started! ");
    }
}

class Processor : Component
{
    public override void Start()
    {
        base.Start();
        Console.WriteLine("Software instruction can now be executed.");
    }
}

اکنون حلقه Foreach ما بسیار ساده خواهد بود، زیرا نیازی نیست خودمان نوع دقیق آن را پیدا کنیم!

foreach (var component in components)
{
    component.Start();
}

پس از اجرای برنامه، خواهیم دید که اجرای متد Start کلاس والد قبل از اجرای متد start کلاس فرزند فراخوانی می شود.

Processor was started! Software instruction can now be executed.
GraphicsCard was started! Graphics can now be rendered to the screen.
HardDrive was started! Information can now be stored to disk.

خلاصه مطلب

چند شکلی در برنامه نویسی به این معنی است که انواع می توانند اشکال مختلفی داشته باشند، یعنی رفتار متفاوتی داشته باشند یا ویژگی های متفاوتی داشته باشند.

در سی شارپ یکی از راه های قدرتمند برای پیاده سازی چندشکلی از طریق اعضای نوع مجازی (virtual type members) است.

سپس، در صورت نیاز می‌توانید آن اعضا را در فرزندان مشتق شده لغو(Override) کنید!

 

منبع: Medium.com