موضوع مقاله: چندریختی (برنامه‌نویسی) | مخاطب: عمومی | لحن: دانشنامه‌ای | ساختار: عنوان، مقدمه، 3 بخش، جمع‌بندی | مقاله: | # چندریختی (برنامه‌نویسی) | مقدمه: چندریختی یا پلی‌مورفیسم ، هنر بهره‌برداری از این ویژگی ساده و در عین حال قدرتمند و کاربردی است که متدلوژی شی‌گرایی را به حد کامل توانایی‌اش می‌رساند. | ## بخش 1: چندریختی (برنامه‌نویسی) | مفهوم چندریختی ویژگی است که به رابط‌ها امکان می‌دهد تا برای گروهی از عملیات‌ها مورد استفاده قرار گیرند. در این مقاله مفهوم چندریختی از طریق دو مفهوم بازنویسی متدها و سربارشده پشتیبانی می‌شود. ما با بررسی این دو مفهوم به دنبال بررسی تأثیر مفهوم چندریختی روی برنامه‌نویسی شیء گرا هستیم. با توجه به مطالب ارائه شده در این مقاله می‌توان گفت که مفهوم چندریختی یکی از سه اصول مهم در برنامه‌نویسی شیء گرا است. در نتیجه مفاهیم نهان‌سازی و وراثت به همراه مفهوم چندریختی سه رکن اصلی برنامه‌نویسی شئ‌گرا را تشکیل می‌دهند. این بدین معناست که این امکان وجود دارد که یک رابط عمومی برای گروهی از فعالیت‌های مرتبط به هم طراحی شود. در برنامه‌های شیء گرا مانند جاوا، این امکان فراهم شده تا دو یا بیش از دو متد همنام در یک کلاس تعریف نمود، مشروط بر اینکه تعریف پارامترهای آن متفاوت باشد. از چندریختی به منظور تعیین انواع مختلف متدهای پویا، در زمان اجرا استفاده می‌شود؛ که این یکی از قدرتمندترین امکاناتی است که چندریختی به وجود می‌آورد. چنانچه نام و امضای متدی از یک زیر کلاس 《در ساختار سلسله مراتبی کلاس‌ها 》 با نام و نوع امضای متدی از ابر کلاس آن یکسان باشد، در آن صورت متد موجود در زیر کلاس، متد موجود در ابر کلاسش را لغو می‌کند. مفاهیم سربار کردن و لغو کردن متدها از جمله مفاهیمی هستند که چندریختی بر پایهٔ آن‌ها بنا می‌شود. در این مقاله پس از بررسی اجمالی مفهوم چندریختی در بخش اول، در بخش دوم، مفهوم سربار کردن متدها را با ذکر چند مثال خواهیم دید. در بخش سوم نیز مفهوم متدهای لغو شده یا همان توابع مجازی را خواهیم آورد و در بخش پایانی نیز به بررسی تأثیر وجود مفهوم چندریختی در برنامه‌نویسی شیءگرا 《مانند جاوا》 و مقایسهٔ آن با برنامه‌هایی که چندریختی را پشتیبانی نمی‌کنند 《مانند زبان برنامه‌نویسی C》 خواهیم پرداخت. به عنوان مثال یک پشته (فهرستی که آنچه آخر به آن وارد شود، اول خارج می‌شود) را در نظر می‌گیریم. پشته‌ای برای مقادیر صحیح، پشته‌ای برای مقادیر اعشاری با ممیز شناور و پشتهٔ دیگری برای کاراکترها مورد استفاده قرار می‌گیرد. در زبان‌های غیر شیء گرا، می‌بایست سه روتین مختلف، یکی برای هریک از پشته‌ها، ایجاد نمود. اما، به دلیل وجود رکنی به نام چندریختی، می‌توان مجموعه‌ای از روتین‌ها را با نام‌های یکسان ایجاد نمود. | ## بخش 2: چندریختی (برنامه‌نویسی) | این امر با فراهم ساختن امکان استفاده از یک رابط برای مشخص کردن یک کلاس عمومی از عملیات، به کاهش پیچیدگی کمک می‌کند؛ و این کامپایلر است که عمل مورد نظر را (یعنی متد مربوطه) متناسب با هر یک از شرایط انتخاب می‌کند. چنانچه بوی گربه‌ای به مشام سگی برسد، در آن صورت واق واق می‌کند و به دنبال گربه خواهد رفت. اما اگر بوی غذا به مشامش برسد، بزاق آن ترشح خواهد کرد و به طرف ظرف غذا خواهد رفت. تفاوت این دو حالت، بویی است که به مشام سگ می‌رسد؛ یعنی، نوع داده‌ای که بینی سگ بر روی آن کار انجام می‌دهد! چندریختی، نهان‌سازی و وراثت با هم کار می‌کنند چنانچه سه اصل چندریختی، نهان‌سازی و وراثت به درستی به کار برده شوند، به خوبی با هم ترکیب شده و محیط برنامه سازیی را فراهم می‌سازند که بهتر از مدل فرایندگرا، از تولید برنامه‌های با استحکام تر و با قابلیت انتقال بیشتر پشتیبانی خواهد نمود. مجموعه کلاس‌هایی که به خوبی به صورت سلسله مراتبی سازمان دهی شده باشند، پایه و اساس کدهای قابل استفادهٔ مجددی را تشکیل می‌دهند که زمان و انرژی زیادی برای تولید و آزمایش آن‌ها صرف می‌شود. نهان‌سازی امکان انتقال کدهای پیاده‌سازی شده را بدون تجزیهٔ آن‌ها متناسب با رابط عمومی کلاس‌ها فراهم می‌سازد. چندریختی امکان ایجاد کدهای شفاف، معقول، خوانا و قابل استفادهٔ مجدد را فراهم می‌سازد. از طریق کاربرد اصول شیءگرا، بخش‌های گوناگون یک برنامهٔ پیچیده را می‌توان ترکیب نمود و موجودیتی یکپارچه، با استحکام و قابل مدیریت تشکیل داد. سربار کردن متدها تعریف و چگونگی انجام آن در زبان‌های برنامه‌نویسی شیءگرا مانند جاوا می‌توانیم دو ویا بیشتر از دو متد همنام را در یک کلاس تعریف نماییم (با شرط آنکه پارامترهای آن را متفاوت تعریف نماییم). وقتی متد سربار شدهشده‌ای فعال می‌شود، جاوا از نوع یا تعداد آرگومان‌ها برای تعیین اینکه کدام نگارش از متدها ی سربار شده فراخوانده شده‌است، استفاده می‌کند. اگرچه نوع مقادیری که این متدها برمی‌گردانند ممکن است متفاوت باشد، اما نوع مقادیر به تنهایی برای تمایز بین آن‌ها کفایت نمی‌کند. وقتی که جاوا با عبارت فراخوانی این گونه متدها مواجه می‌شود، متدی را اجرا می‌کند که پارامترهای آن با آرگومان‌های مورد استفاده در عبارت فراخوانی مطابقت داشته باشد. وقتی متدی را سربار می‌کنیم، هر یک از نگارش‌های آن می‌توانند یکی از کارهای مورد نظر را انجام دهند. هیچ قانونی مبنی بر اینکه متدهای سربار شده شده باید با یکدیگر مرتبط باشند وجود ندارد. اما از منظر سبک کار، فرایند سربار شده کردن متدها به خودی خود القاءکنندهٔ نوعی رابطه‌است. | ## بخش 3: چندریختی (برنامه‌نویسی) | ازاین رو، اگرچه با استفاده از نامی مشترک می‌توانیم متدهای غیر مرتبط را سربار شده کنیم، اما توصیه می‌شود که این کار را انجام ندهیم. سربار کردن سازنده‌ها همان‌طور که می‌دانیم، هر کلاسی که در جاوا ایجاد می‌کنیم، می‌تواند دارای سازنده باشد. اگر سازنده‌ای برای کلاسی ننویسیم، جاوا یک سازنده برای آن کلاس می‌نویسد که از طریق آن می‌توان اشیای آن کلاس را ایجاد کرد. این کلاس به فیلدهای اشیاء نیز مقادیر اولیه مناسبی می‌دهد؛ یعنی، به عنوان مثال فیلدهای عددی را برابر صفر و فیلدهای رشته‌ای را برابر تهی قرار می‌دهد. درحقیقت، در بیشتر کلاس‌های مربوط به کارهای واقعی، سازنده‌های سربار شده، نه تنها استثنا به‌شمار نمی‌آیند، بلکه کاملاً معمول خواهند بود. مثالی از سازنده‌های سربار شده در ادامه مثالی از سازنده‌های سربار شده نمایش داده شده‌است. در این مثال کلاس Book طراحی شده‌است که دارای سه سازنده با امضاهای متفاوت می‌باشد. وقتی متد بازنویسی شده‌ای از یک زیر کلاس فراخوانده می‌شود، همیشه از نگارش تعریف شده در زیر کلاس استفاده خواهد شد. تعیین پویای متدها مکانیزم لغو کردن متدها، پایه و اساس یکی از قدرتمندترین مفاهیم برنامه‌نویسی شیء گرا را تشکیل می‌دهد، تعیین پویای متدها. تعیین پویای متدها مکانیزمی است که جاوا با استفاده از آن، حاصل عبارت فراخوانی متدهای لغو شده را به جای زمان کامپایل، در زمان اجرا تعیین می‌کند. دلیل اهمیت این مکانیزم آن است که جاوا، چندریختی زمان اجرا را با آن پیاده‌سازی می‌کند. اینک کار خود را با بیان مجدد یک اصل مهم آغاز می‌کنیم: متغیرهای ارجاع ابر کلاس‌ها می‌توانند به شیءهای زیرکلاس‌ها ارجاع داشته باشند. جاوا با استفاده از این امر، مسئلهٔ تعیین متدهای لغو شده را در زمان اجرا حل می‌کند. وقتی متد لغو شده‌ای از طریق ارجاع یک ابر کلاس فراخوانده می‌شود، جاوا بر اساس نوع شیئی که در زمان فراخوانی به آن ارجاع می‌شود، تعیین می‌کند که کدام نگارش از متد اجرا شود. وقتی ارجاع به انواع مختلف شیءها صورت می‌گیرد، نگارش‌های مختلفی از یک متد لغو شده فراخوانده خواهند شد. | ## جمع‌بندی | به عبارت دیگر نوع شیء مورد ارجاع (ونه متغیر ارجاع) است که تعیین می‌کند که کدام نگارش ازیک متد لغو شده، اجرا خواهدشد.