چندریختی (برنامه‌نویسی): تفاوت میان نسخه‌ها

محتوای حذف‌شده محتوای افزوده‌شده
بدون خلاصۀ ویرایش
خط ۴:
یکی از ویژگی‌های کلیدی در کلاس‌های مشتق‌شده این است که یک اشاره‌گر به یک کلاس مشتق‌شده، از نظر نوع داده‌ای با اشاره‌گر به کلاس اصلی آن سازگار است. '''چندریختی''' یا پلی‌مورفیسم، هنر بهره‌برداری از این ویژگی ساده، اما قدرتمند و کاربردی است که متدلوژی شی‌گرایی را به حد کامل توانایی‌اش می‌رساند.<ref>{{یادکرد کتاب|عنوان=برنامه سازی پیشرفته با ++C|نام خانوادگی=دکتر بابک بشری راد|نام=|ناشر=ناقوس|سال=1394|شابک=978-964-377-746-3|مکان=تهران|صفحات=143}}</ref>
 
مفهوم چندریختی ویژگی است که به رابط‌ها امکان می‌دهد تا برای گروهی از عملیات‌ها مورد استفاده قرار گیرند. در این مقاله مفهوم چندریختی از طریق دو مفهوم متدهای Override (توابع مجازی) و Overloadسربارشده شده(به انگلیسی:Overload) پشتیبانی می‌شود. ما با بررسی این دو مفهوم در پی نشان دادن تأثیر مفهوم چندریختی روی [[برنامه‌نویسی شیء گرا]] خواهیم بود.
روش به کار برده شده در این تحقیق از طریق مطالعه منابعی از جمله کتب مرتبط با برنامه‌نویسی، راهنمای برنامه‌های شیء گرا و اجرای برنامه‌هایی با ماهیت چندریختی می‌باشد.
با توجه به مطالب ارائه شده در این مقاله می‌توان گفت که مفهوم چندریختی یکی از سه اصول مهم در برنامه‌نویسی شیء گرا می‌باشد. درنتیجه مفاهیم نهان سازی و وراثت به همراه مفهوم چندریختی سه پایهٔ اصلی برنامه‌نویسی شی ء گرا را تشکیل می‌دهند.
کلمات کلیدی: چندریختی، Overloadسربار کردن, Override و متد.
 
:چندریختی به معنای چندین شکل از یک متد است. مفهوم چندریختی اغلب به وسیلهٔ عبارت «یک رابط، چند متد» بیان می‌شود. این بدین معناست که این امکان وجود دارد که یک رابط عمومی برای گروهی از فعالیت‌های مرتبط به هم طراحی شود.
در برنامه‌های شیء گرا مانند جاوا، این امکان فراهم شده تا دو و یا بیش از دو متد همنام در یک کلاس تعریف نمود،
مشروط بر اینکه تعریف پارامترهای آن متفاوت باشد. در این موارد متدها Overloadسربار می‌شوند.
از چندریختی به منظور تعیین انواع مختلف متدهای پویا، در زمان اجرا استفاده می‌شود؛ که این یکی از قدرتمندترین امکاناتی است که چندریختی به وجود می‌آورد.
:چنانچه نام و امضای متدی از یک زیر کلاس (در ساختار سلسله مراتبی کلاس‌ها) با نام و نوع امضای متدی از فوق کلاسش یکسان باشد، در آن صورت متد موجود در زیر کلاس، متد موجود در فوق کلاسش را Override می‌کند.
مفاهیم Overloadسربار وOverrideکردن و Override کردن متدها از جمله مفاهیمی هستند که چندریختی بر پایهٔ آن‌ها بنا می‌شود.
در این مقاله پس از بررسی اجمالی مفهوم چندریختی در بخش اول، در بخش دوم مفهوم Overloadسربار کردن متدها را با ذکر چند مثال خواهیم دید. در بخش سوم نیز مفهوم متدهای Override شده یا همان [[توابع مجازی]] را خواهیم آورد و در بخش پایانی نیز به بررسی تأثیر وجود مفهوم چندریختی در [[برنامه‌نویسی شیءگرا]] (مانند جاوا) و مقایسهٔ آن با برنامه‌هایی که چندریختی را پشتیبانی نمی‌کنند (مانند [[زبان برنامه‌نویسی]] C) خواهیم پرداخت.
 
== مفهوم چندریختی ==
خط ۳۰:
از طریق کاربرد اصول شیءگرا، بخش‌های گوناگون یک برنامهٔ پیچیده را می‌توان ترکیب نمود و موجودیتی یکپارچه، با استحکام و قابل مدیریت تشکیل داد.
 
== Overloadسربار کردن متدها ==
=== تعریف و چگونگی انجام آن ===
:در [[زبان‌های برنامه‌نویسی]] شیءگرا مانند جاوا می‌توانیم دو ویا بیشتر از دو متد همنام را در یک کلاس تعریف نماییم (با شرط آنکه پارمترهای آن را متفاوت تعریف نماییم). به این فرایند Overloadسربار کردنشدهکردن متدها گفته می‌شود. این فرایند یکی از روش‌هایی است که جاوا از طریق آن از چند ریختی پشتیبانی می‌کند.
:وقتی متد Overloadسربار شده‌ایشدهشده‌ای فعال می‌شود، جاوا از نوع و یا تعداد آرگومان‌ها برای تعیین اینکه کدام نگارش از متدها ی Overloadسربار شده فراخوانده شده‌است، استفاده می‌کند. از این رو متدهای Overloadسربار شده از جهت نوع و تعداد پارامترها با یکدیگر تفاوت دارند.
:اگرچه نوع مقادیری که این متدها برمی‌گردانند ممکن است متفاوت باشد، اما نوع مقادیر به تنهایی برای تمایز بین آن‌ها کفایت نمی‌کند. وقتی که جاوا با عبارت فراخوانی این گونه متدها مواجه می‌شود، متدی را اجرا می‌کند که پارامترهای آن با آرگومان‌های مورد استفاده در عبارت فراخوانی مطابقت داشته باشد.
:وقتی متدی را Overloadسربار می‌کنیم، هر یک از نگارش‌های آن می‌توانند یکی از کارهای مورد نظر را انجام دهند. هیچ قانونی مبنی بر اینکه متدهای Overloadسربار شده شده باید با یکدیگر مرتبط باشند وجود ندارد. اما از منظر سبک کار، فرایند Overloadسربار شده کردن متدها به خودی خود القاءکنندهٔ نوعی رابطه‌است. ازاین رو، اگرچه با استفاده از نامی مشترک می‌توانیم متدهای غیر مرتبط را Overloadسربار شده کنیم، اما توصیه می‌شود که این کار را انجام ندهیم. در عمل، باید تنها عملیات مرتبط به هم را Overloadسربار شده کرد.
 
=== Overloadسربار کردنردن سازنده‌ها ===
:همان‌طور که می‌دانیم، هر کلاسی که در جاوا ایجاد می‌کنیم، می‌تواند دارای سازنده باشد. اگر سازنده‌ای برای کلاسی ننویسیم، جاوا یک سازنده برای آن کلاس می‌نویسد که از طریق آن می‌توان اشیای آن کلاس را ایجاد کرد. این کلاس به فیلدهای اشیاء نیز مقادیر اولیه مناسبی می‌دهد. یعنی، به عنوان مثال فیلدهای عددی را برابر صفر و فیلدهای رشته‌ای را برابر تهی قرار می‌دهد.
:متدهای سازنده را نیز می‌توان همچون متدهای معمولی Overloadسربار کرد. درحقیقت، در بیشتر کلاس‌های مربوط به کارهای واقعی، سازنده‌های Overloadسربار شده، نه تنها استثنا به شمار نمی‌آیند، بلکه کاملاً معمول خواهند بود.
====مثالی از سازنده های سربار شده====
در ادامه مثالی از سازنده های سربار شده نمایش داده شده است. در این مثال کلاس Book طراحی شده است که دارای سه سازنده با امضاهای متفاوت می باشد. <source lang="java">public class Book{