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

محتوای حذف‌شده محتوای افزوده‌شده
جز ویرایش 46.225.116.158 (بحث) به آخرین تغییری که MahdiBot انجام داده بود واگردانده شد
Mahan.2002 (بحث | مشارکت‌ها)
جزبدون خلاصۀ ویرایش
برچسب: نیازمند بازبینی
خط ۲:
{{ویکی‌سازی}}
{{بدون منبع}}
مفهوم چندریختی ویژگی است که به رابط‌ها امکان می‌دهد تا برای گروهی از عملیات‌ها مورد استفاده قرار گیرند. در این مقاله مفهوم چندریختی از طریق دو مفهوم متدهای Override (توابع مجازی) و Overload شده پشتیبانی می‌شود. ما با بررسی این دو مفهوم در پی نشان دادن تاثیر مفهوم چندریختی روی برنامه نویسی شیء گرا خواهیم بود.
روش به کار برده شده در این تحقیق از طریق مطالعه منابعی از جمله کتب مرتبط با برنامه نویسی، راهنمای برنامه‌های شیء گرا و اجرای برنامه‌هایی با ماهیت چندریختی می‌باشد.
با توجه به مطالب ارائه شده در این مقاله می‌توان گفت که مفهوم چندریختی یکی از سه اصول مهم در برنامه نویسی شیء گرا می‌باشد. درنتیجه مفاهیم نهان سازی و وراثت به همراه مفهوم چندریختی سه پایهٔ اصلی برنامه نویسی شی ء گرا را تشکیل می‌دهند.
خط ۱۱:
مشروط بر اینکه تعریف پارامترهای آن متفاوت باشد. در این موارد متدها Overload می‌شوند.
از چندریختی به منظورتعیین انواع مختلف متدهای پویا، در زمان اجرا استفاده می‌شود. که این یکی از قدرتمندترین امکاناتی است که چندریختی به وجود می‌آورد.
:چنانچه نام و امضای متدی از یک زیر کلاس (در ساختار سلسله مراتبی کلاس‌ها) با نام و نوع امضای متدی از فوق کلاسش یکسان باشد، در آن صورت متد موجود در زیر کلاس، متد موجود در فوق کلاسش را Override می‌کند.
مفاهیم Overload وOverride کردن متدها از جمله مفاهیمی هستند که چندریختی بر پایهٔ آن‌ها بنا می‌شود.
در این مقاله پس از بررسی اجمالی مفهوم چندریختی در بخش اول، در بخش دوم مفهوم Overload کردن متدها را با ذکر چند مثال خواهیم دید. در بخش سوم نیز مفهوم متدهای Override شده یا همان توابع مجازی را خواهیم آورد و در بخش پایانی نیز به بررسی تاثیر وجود مفهوم چندریختی در برنامه نویسی شیءگرا( (مانند جاوا) و مقایسهٔ آن با برنامه‌هایی که چندریختی را پشتیبانی نمی‌کنند( مانند زبان برنامه نویسیCنویسی C ) خواهیم پرداخت.
== مفهوم چندریختی ==
=== تعریف ===
:چندریختی(که از زبان یونانی گرفته می‌شود)، ویژگی است که رابط‌ها از طریق آن به گروهی از عملیات‌ها دست می‌یابند. عمل خاص مورد نظر توسط ماهیت دقیق شرایط جاری تعیین می‌شود.
به عنوان مثال یک پشته (فهرستی که آنچه آخر به آن وارد شود، اول خارج می‌شود) را در نطرنظر می‌گیریم. ممکن است برنامه‌ای داشته باشیم که به سه نوع پشته نیاز دارد. پشته‌ای برای مقادیر صحیح، پشته‌ای برای مقادیر اعشاری با ممیز شناور و پشتهٔ دیگری برای کاراکترها مورد استفاده
قرار می‌گیرد.
:الگوریتم پیاده سازی پشته‌ها با وجود متفاوت بودن نوع مقادیر، یکسان است. در زبان‌های غیر شیء گرا، می‌بایست سه روتین مختلف، یکی برای هریک از پشته‌ها، ایجاد نمود.اما، به دلیل وجود رکنی به نام چندریختی، می توان مجموعه‌ای از روتین‌ها را با نام‌های یکسان ایجاد نمود.
به طور کلی، چندریختی به وسیلهٔ عبارت«یک رابط، چند متد» بیان می‌شود. این امر با فراهم ساختن امکان استفاده از یک رابط برای مشخص کردن یک کلاس عمومی از عملیات، به کاهش پیچیدگی کمک می‌کند. و این کامپایلر است که عمل مورد نظر را (یعنی متد مربوطه) متناسب با هر یک از شرایط انتخاب می‌کند.
به عنوان مثال حس بویایی سگ‌ها نمونه‌ای از چندریختی می‌باشد. چنانچه بوی گربه‌ای به مشام سگی برسد، درآن صورت واق واق می‌کند وبه دنبال گربه خواهد رفت. اما اگر بوی غذا به مشامش برسد، بزاق آن ترشح خواهد کرد و به طرف ظرف غذا خواهد رفت. در هر دو شرایط مزبور، یک نوع حس بویایی کار می‌کند. تفاوت این دو حالت، بویی است که به مشام سگ می‌رسد. یعنی، نوع داده‌ای که بینی سگ بر روی آن کار انجام می‌دهد!
=== چندریختی، نهان سازی و وراثت با هم کار می‌کنند ===
خط ۲۷:
== Overload کردن متدها ==
=== تعریف و چگونگی انجام آن ===
:در زبان‌های برنامه نویسی شیءگرا مانند جاوا می‌توانیم دو ویا بیشتر از دو متد همنام را در یک کلاس تعریف نماییم. (با شرط آنکه پارمترهای آن را متفاوت تعریف نماییم.).به این فرایند Overload کردن متدها گفته می‌شود. این فرایند یکی از روش‌هایی است که جاوا از طریق آن از چند ریختی پشتیبانی می‌کند.
:وقتی متد Overload شده‌ای فعال می‌شود، جاوا از نوع و یا تعداد آرگومان‌ها برای تعیین اینکه کدام نگارش از متدها ی Overload شده فراخوانده شده‌است، استفاده می‌کند. از این رو متدهای Overload شده از جهت نوع و تعداد پارامترها با یکدیگر تفاوت دارند.
:اگرچه نوع مقادیری که این متدها برمی گردانند ممکن است متفاوت باشد، اما نوع مقادیر به تنهایی برای تمایز بین آن‌ها کفایت نمی‌کند. وقتی که جاوا با عبارت فراخوانی این گونه متدها مواجه می‌شود، متدی را اجرا می‌کند که پارامترهای آن با آرگومان‌های مورد استفاده در عبارت فراخوانی مطابقت داشته باشد.
خط ۳۷:
=== Override کردن متدها(توابع مجازی) ===
===تعریف و چگونگی انجام آن===
:چنانچه نام و نوع امضای ( هدر متد که از نام و پارامترها تشکیل می‌شود ) متدی از یک زیر کلاس با نام و امضای متدی از فوق کلاسش یکسان باشد، در آن صورت اصطلاحاً می‌گوییم که متد موجود در زیرکلاس، متد موجود در فوق کلاس را Override می‌کند.
:وقتی متد Override شده‌ای از یک زیر کلاس فراخوانده می‌شود، همیشه از نگارش تعریف شده در زیر کلاس استفاده خواهد شد. نگارش تعریف شده در فوق کلاس پنهان خواهد شد.
=== تعیین پویای متدها ===
:مکانیزم Override کردن متدها، پایه و اساس یکی ازقدرتمندترین مفاهیم برنامه نویسی شیء گرا (جاوا) را تشکیل می‌دهد، تعیین پویای متدها.تعیین پویای متدها مکانیزمی است که جاوا با استفاده از آن، حاصل عبارت فراخوانی متدهای OverrideشدهOverride شده را به جای زمان کامپایل، در زمان اجرا تعیین می‌کند. دلیل اهمیت این مکانیزم آن است که جاوا، چندریختی زمان اجرا را با آن پیاده سازی می‌کند.
:اینک کار خود را با بیان مجدد یک اصل مهم آغاز می‌کنیم: متغیرهای ارجاع فوق کلاس‌ها می‌توانند به شیءهای زیرکلاس‌ها ارجاع داشته باشند. جاوا با استفاده از این امر، مسئلهٔ تعیین متدهای Override شده را در زمان اجرا حل می‌کند. چگونگی انجام این کار به این شرح است. وقتی متد Override شده‌ای از طریق ارجاع یک فوق کلاس فراخوانده می‌شود، جاوا بر اساس نوع شیئی که در زمان فراخوانی به آن ارجاع می‌شود، تعیین می‌کند که کدام نگارش از متد اجرا شود.از این رو این کار در زمان اجرا انجام می‌شود.
:وقتی ارجاع به انواع مختلف شیءها صورت می‌گیرد، نگارش‌های مختلفی از یک متد Override شده فراخوانده خواهند شد. به عبارت دیگر نوع شیء مورد ارجاع(ونه متغیر ارجاع) است که تعیین می‌کند که کدام نگارش ازیک متدOverride شده، اجرا خواهدشد.