چندشکلی موقت

در زبان‌های برنامه‌نویسی ، **چندشکلی ad hoc**  نوعی چندشکلی است که در آن توابع چند شکلی را می‌توان به آرگومان‌هایی با انواع مختلف اعمال کرد، زیرا یک تابع چندشکلی می‌تواند بسته به نوع آرگومان(هایی) که برای آن اعمال می‌شود، تعدادی پیاده‌سازی متمایز و بالقوه ناهمگن را نشان دهد. هنگامی که به مفاهیم شی گرا یا رویه ای اعمال می شود، به عنوان اضافه بار تابع یا بارگذاری بیش از حد اپراتور نیز شناخته می شود. اصطلاح اد هوک در این زمینه به معنای توهین آمیز نیست. صرفاً به این واقعیت اشاره دارد که این نوع چندشکلی یک ویژگی اساسی سیستم نوع نیست. این برخلاف چندشکلی پارامتریک است که در آن توابع چند شکلی بدون ذکر نوع خاصی نوشته می‌شوند و بنابراین می‌توانند یک پیاده‌سازی انتزاعی را برای هر تعداد نوع به روش شفاف اعمال کنند. این طبقه بندی توسط کریستوفر استراچی در سال 1967 معرفی شد.

## اتصال اولیه
چند شکلی موقت یک مکانیسم توزیع است: کنترلی که از طریق یک تابع نامگذاری شده حرکت می کند، بدون نیاز به تعیین دقیق تابع فراخوانی شده، به توابع مختلف دیگر ارسال می شود. اضافه بار اجازه می دهد تا چندین تابع که انواع مختلف دارند با یک نام تعریف شوند. کامپایلر یا مفسر به طور خودکار از فراخوانی تابع مناسب اطمینان حاصل می کند. به این ترتیب، توابعی که لیست‌های اعداد صحیح ، لیست رشته‌ها ، فهرست‌های اعداد واقعی و غیره را اضافه می‌کنند، می‌توانند نوشته شوند، و همه آنها را *ضمیمه* می‌نامند &#x2014; و تابع *پیوست* سمت راست بر اساس نوع لیست‌هایی که الحاق می‌شوند فراخوانی می‌شود. این با چند شکلی پارامتریک متفاوت است، که در آن تابع باید *به طور کلی* نوشته شود تا با هر نوع لیستی کار کند. با استفاده از اضافه بار، ممکن است یک تابع بر اساس نوع ورودی که به آن ارسال می شود، دو کار کاملاً متفاوت را انجام دهد. این با چند شکلی پارامتریک امکان پذیر نیست (اما باید با روشن کردن نوع در داخل تابع عمومی به دست آید). روش دیگر برای نگاه کردن به بارگذاری بیش از حد این است که یک روال به طور منحصر به فرد نه با نام خود، بلکه با ترکیب نام و تعداد، ترتیب و انواع پارامترهای آن شناسایی می شود.

این نوع چندشکلی در زبان های برنامه نویسی شی گرا رایج است، که بسیاری از آنها به عملگرها اجازه می دهند تا به روشی مشابه توابع بارگذاری شوند (به بارگذاری بیش از حد اپراتور مراجعه کنید). برخی از زبان‌هایی که به‌صورت پویا تایپ نشده‌اند و فاقد چندشکلی خاص (از جمله کلاس‌های نوع) هستند، نام‌های تابع طولانی‌تری دارند مانند `print_int` ، `print_string` ، و غیره.

مزیتی که گاهی از بارگذاری بیش از حد به دست می آید، ظاهر تخصصی است، به عنوان مثال، یک تابع با نام یکسان را می توان به روش های مختلف پیاده سازی کرد، که هر کدام برای انواع داده های خاصی که روی آنها کار می کند بهینه شده است. این می‌تواند یک رابط کاربری مناسب برای کدهایی که به دلایل عملکرد باید در موقعیت‌های مختلف تخصصی شوند، فراهم کند. نکته منفی این است که نوع سیستم نمی تواند سازگاری پیاده سازی های مختلف را تضمین کند.

از آنجایی که بارگذاری بیش از حد در زمان کامپایل انجام می شود، جایگزینی برای اتصال دیرهنگام همانطور که در چند شکلی زیرگروهی یافت می شود، نیست.

## دیر صحافی
با وجود بخش قبلی، راه‌های دیگری وجود دارد که چندشکلی *موقتی* می‌تواند کار کند. به عنوان مثال زبان Smalltalk را در نظر بگیرید. در Smalltalk ، بارگذاری بیش از حد در زمان اجرا انجام می شود، زیرا روش ها ("اجرای تابع") برای هر پیام بارگذاری شده ("عملکرد بیش از حد") زمانی که در شرف اجرا هستند حل می شوند. این در زمان اجرا و پس از کامپایل شدن برنامه اتفاق می افتد. بنابراین، پلی‌مورفیسم با چندشکلی زیرمجموعه مانند سایر زبان‌ها ارائه می‌شود، و همچنین در زمان اجرا با چندشکلی *ad hoc* ، عملکرد آن گسترش می‌یابد.

نگاه دقیق‌تر همچنین نشان می‌دهد که Smalltalk تنوع کمی متفاوت از چند شکلی *ad hoc* را ارائه می‌دهد. از آنجایی که Smalltalk دارای یک مدل اجرای باند دیرهنگام است، و از آنجایی که اشیایی را برای مدیریت پیام‌هایی که درک نمی‌شوند، فراهم می‌کند، امکان پیاده‌سازی عملکرد با استفاده از چند شکلی بدون بارگذاری صریح یک پیام خاص وجود دارد. این ممکن است به طور کلی برای برنامه نویسی روزمره توصیه نشود، اما می تواند هنگام اجرای پروکسی ها بسیار مفید باشد.

همچنین، در حالی که به طور کلی روش کلاس رایج و اضافه بار سازنده چند شکلی در نظر گرفته نمی شود، زبان های یکنواخت تری وجود دارند که در آن کلاس ها اشیاء منظم هستند. به عنوان مثال، در Smalltalk، کلاس ها اشیاء منظم هستند. به نوبه خود، این بدان معناست که پیام‌های ارسال شده به کلاس‌ها می‌توانند بیش از حد بارگذاری شوند، و همچنین می‌توان اشیایی را ایجاد کرد که مانند کلاس‌ها رفتار کنند بدون اینکه کلاس‌های آنها از سلسله مراتب کلاس‌ها به ارث ببرند. اینها تکنیک‌های مؤثری هستند که می‌توان از آنها برای بهره‌گیری از قابلیت‌های بازتابی قدرتمند اسمال‌تاک استفاده کرد. ترتیبات مشابه در زبانهایی مانند Self و Newspeak نیز امکان پذیر است.

## مثال
یک عملگر `+` را تصور کنید که ممکن است به روش های زیر استفاده شود:

# `1 + 2 = 3`
# `3.14 + 0.0015 = 3.1415`
# `1 + 3.7 = 4.7`
# `[1, 2, 3] + [4, 5, 6] = [1, 2, 3, 4, 5, 6]`
# `[true, false] + [false, true] = [true, false, false, true]`
# `"bab" + "oon" = "baboon"`

برای رسیدگی به این شش فراخوانی تابع، به چهار قطعه کد مختلف نیاز است (یا سه قطعه، اگر رشته ها به عنوان لیستی از کاراکترها در نظر گرفته شوند):

* در حالت اول، جمع اعداد صحیح باید فراخوانی شود.
* در حالت دوم و سوم، جمع ممیز شناور باید مورد استناد قرار گیرد (با ارتقای نوع یا اجبار نوع در حالت سوم).
* در حالت چهارم و پنجم، الحاق فهرست باید مورد استناد قرار گیرد.
* در آخرین مورد، الحاق رشته باید فراخوانی شود.

بنابراین، نام `+` در واقع به سه یا چهار عملکرد کاملا متفاوت اشاره دارد. این نمونه ای از *[[چندریختی (برنامه‌نویسی)|اضافه بار]]* یا به طور خاص تر، *[[سربارگذاری عملگرها|بارگذاری بیش از حد اپراتور]]* است.

به ابهام در انواع رشته های مورد استفاده در مورد آخر توجه کنید. `"123" + "456"` را در نظر بگیرید که در آن برنامه نویس *به طور طبیعی* ممکن است به جای الحاق، جمع را فرض کند. آنها ممکن است انتظار `"579"` را به جای `"123456"` داشته باشند. بنابراین بارگذاری بیش از حد می تواند معانی یا معنایی متفاوتی برای یک عملیات و همچنین پیاده سازی های متفاوت ارائه دهد.

## جستارهای وابسته

* بارگذاری بیش از حد اپراتور
* چند شکلی (علوم کامپیوتر) (انواع دیگر چندشکلی)
* پلی مورفیسم پارامتریک

## منابع

رده:زبان‌های برنامه‌نویسی
رده:چندریختی (علوم رایانه)
رده:نظریه نوع‌ها