مفهوم Polymorphism
این مفهوم یکی از سه ویژگی اساسی برنامه نوسی شی گرا می باشد. کسی که برنامه نویسی شی گرا می داند با این مفاهیم اجین شده است و لاغیر!
۱٫ فرض کنیم، کلاسی پایه به نام Shape داریم. این کلاس، متدی به نام Draw دارد که وظیفه کشیدن شکل بر روی صفحه را به عهده دارد.
۲٫ کلاس های دلخواهی را از کلاس Shape به ارث می بریم. مثلا کلاس Circle (دایره)، کلاس Rectangle (مستطیل) و کلاس Square (مربع). طبیعتا هر کدام از این ها باید به نحو خاصی بر روی صفحه کشیده شوند و با هم متفاوتند. پس هر کدام از این ها، متد Draw را که از کلاس Shape به ارث برده اند، override می کنند و در این متد، کد مربوط به نحوه کشیدن شان را قرار می دهیم.
۳٫ فرض کنیم کلاسی به نام Monitor داریم. این کلاس وظیفه دارد تا اشکال مختلف را بگیرد و بر روی صفحه نمایش دهد.
آیا باید به ازای هر شکلی که داریم متد های جداگانه ای در کلاس Monitor تعریف کنیم؟ مثل متد های DrawCircle، DrawRectangle و DrawSquare؟ اگر تعداد اشکال به مرور زیاد شد باید هر بار کلاس Monitor هم تغییر بدهیم و کدهای مربوط به شکل جدید را اضافه کنیم؟ در این صورت اشکال و کلاس Monitor دچار Coupling شده اند!!!
۴٫ راه حل: می توانیم در کلاس مانیتور فقط یک متد تعریف کنیم. نام این متد را Draw می گذاریم. ورودی این متد از جنس کلاس پایه Shape می باشد. در Draw فقط متد Shape.Draw را صدا خواهیم زد و اینجاست که Polymorphism وارد عمل می شود.
– شما یک مستطیل و یا دایره را به متد Monitor.Draw پاس می دهید. چون هر دو از جنس Shape هستن، مشکلی ایجاد نخواهد شد.
– هنگامی که در متد Monitor.Draw، متد Shape.Draw را صدا می زنیم، Polymorphism موجب می شود تا به طور خودکار CLR -مسئول اجرای کد- بداند که شی Shape در واقع از نوع دایره یا مستطیل می باشد و هوشمندانه متد مربوط و خاص به همان کلاس را اجرا می کند و نه کد مربوط به کلاس Shape را!
مفهوم Polymorphism موجب می شود که در هنگام اجرای کد (Run Time)، رفتار های متفاوتی از متد مربوط به کلاس Shape سربزند. این متد گاهی مربع می کشد و گاهی دایره. استفاده از این روش، یکی از راه های کاهش Coupling می باشد.
https://msdn.microsoft.com/en-us/library/ms173152.aspx