Vaqtinchalik polimorfizm - Ad hoc polymorphism

Yilda dasturlash tillari, vaqtincha polimorfizm[1] bir xil polimorfizm bunda polimorf funktsiyalarni har xil turdagi argumentlarga qo'llash mumkin, chunki polimorf funktsiya u qo'llaniladigan argument (lar) turiga qarab bir qator aniq va potentsial heterojen dasturlarni belgilashi mumkin. Ob'ektga yo'naltirilgan yoki protsessual tushunchalarga nisbatan qo'llanilganda, u quyidagicha ham tanilgan funktsiyani haddan tashqari yuklash yoki operatorning ortiqcha yuklanishi. Atama maxsus ushbu kontekstda pejorativ bo'lishi mo'ljallanmagan; bu shunchaki polimorfizmning asosiy xususiyati emasligiga ishora qiladi tizim turi. Bu farqli o'laroq parametrik polimorfizm, bu erda polimorfik funktsiyalar biron bir o'ziga xos turni eslatmasdan yoziladi va shu bilan shaffof usulda istalgan sonli turlarga bitta mavhum dasturni qo'llashi mumkin. Ushbu tasnif tomonidan kiritilgan Kristofer Straxi 1967 yilda.

Erta majburiy

Vaqtinchalik polimorfizm bu jo'natish mexanizm: bitta nomlangan funktsiya orqali harakatlanish boshqaruvi aniq funktsiya ko'rsatilmasdan boshqa funktsiyalarga yuboriladi. Haddan tashqari yuklanish bir xil nomdagi turli xil turlarni olgan bir nechta funktsiyalarni aniqlashga imkon beradi; The kompilyator yoki tarjimon avtomatik ravishda to'g'ri funktsiya chaqirilishini ta'minlaydi. Shunday qilib, butun sonlar ro'yxati, qatorlar ro'yxati, haqiqiy sonlar ro'yxati va boshqalarni qo'shadigan funktsiyalar yozilishi mumkin va barchasi chaqirilishi mumkin qo'shib qo'ying- va o'ngda qo'shib qo'ying qo'shilgan ro'yxatlar turiga qarab funktsiya chaqiriladi. Bu parametr yozilishi kerak bo'lgan parametrik polimorfizmdan farq qiladi umumiy tarzda, har qanday turdagi ro'yxat bilan ishlash. Haddan tashqari yuklanishdan foydalanib, unga uzatiladigan kirish turiga asoslanib, funktsiyani mutlaqo ikki xil bajarishi mumkin; parametrik polimorfizm bilan bu mumkin emas. Haddan tashqari yuklanishni ko'rib chiqishning yana bir usuli shundaki, odatiy tartib uning nomi bilan emas, balki uning nomi va parametrlarining soni, tartibi va turlari kombinatsiyasi bilan aniqlanadi.

Ushbu turdagi polimorfizm keng tarqalgan ob'ektga yo'naltirilgan dasturlash tillarning ko'pi, bunga imkon beradi operatorlar funktsiyalarga o'xshash tarzda ortiqcha yuklanish (qarang. qarang operatorning ortiqcha yuklanishi ). Dinamik ravishda terilmaydigan va maxsus polimorfizmga ega bo'lmagan ba'zi tillarda (shu jumladan tip sinflari) funktsiya nomlari uzunroq bo'ladi. print_int, print_stringVa boshqalar buni o'z nuqtai nazariga qarab ustunlik (ko'proq tavsiflovchi) yoki kamchilik (haddan tashqari so'zma-so'z) sifatida ko'rish mumkin.

Ba'zan haddan tashqari yuklanishdan olinadigan afzallik - bu ixtisoslashuvning ko'rinishi, masalan, bir xil nomdagi funktsiyani turli xil usullar bilan amalga oshirish mumkin, ularning har biri o'zi ishlaydigan ma'lum ma'lumotlar turlari uchun optimallashtirilgan. Bu ishlash uchun bir nechta vaziyatlarga ixtisoslashgan bo'lishi kerak bo'lgan kod uchun qulay interfeysni taqdim etishi mumkin. Salbiy tomoni shundaki, tizim tizimi turli xil dasturlarning izchilligini kafolatlay olmaydi.

Haddan tashqari yuk kompilyatsiya vaqtida amalga oshirilganligi sababli, uning o'rnini bosmaydi kech majburiy topilganidek pastki polimorfizm.

Kechiktirilgan majburiylik

Oldingi bo'limga qaramay, boshqa usullar ham mavjud maxsus polimorfizm amalga oshishi mumkin. Masalan, Smalltalk tilini ko'rib chiqing. Yilda Kichik munozarasi, haddan tashqari yuklanish vaqtida bajariladi, chunki har bir haddan tashqari yuklangan xabar ("haddan tashqari yuklangan funktsiya") uchun usullar ("funktsiyani amalga oshirish") ular bajarilishi arafasida hal qilinadi. Bu dastur tuzilgandan so'ng, ish vaqtida sodir bo'ladi. Shuning uchun polimorfizm quyidagicha beriladi pastki polimorfizm boshqa tillarda bo'lgani kabi va funktsional jihatdan ham kengaytirilgan maxsus ish vaqtidagi polimorfizm.

Yaqindan ko'rib chiqsak, Smalltalk biroz boshqacha xilma-xillikni taqdim etadi maxsus polimorfizm. Smalltalk kechiktirilgan ijro modeliga ega bo'lgani uchun va u ob'ektlarga tushunarsiz xabarlarni boshqarish qobiliyatini ta'minlaganligi sababli, ma'lum bir xabarni ortiqcha yuklamasdan, polimorfizm yordamida oldinga borish va funksionallikni amalga oshirish mumkin. Bu odatda kundalik dasturlash uchun tavsiya etilmasligi mumkin, ammo proksi-serverlarni amalga oshirishda bu juda foydali bo'lishi mumkin.

Bundan tashqari, umumiy ma'noda umumiy sinf usuli va konstruktorning haddan tashqari yuklanishi polimorfizm deb hisoblanmasa ham, sinflar odatiy ob'ektlar bo'lgan bir xil tillar mavjud. Masalan, Smalltalk-da sinflar odatiy ob'ektlardir. O'z navbatida, bu sinflarga yuborilgan xabarlarning haddan tashqari yuklanishini anglatadi, shuningdek, sinflar ierarxiyasidan meros bo'lmasdan sinflar kabi o'zini tutadigan moslamalarni yaratish mumkin. Bu Smalltalkning kuchli aks ettirish qobiliyatidan foydalanish uchun ishlatilishi mumkin bo'lgan samarali usullar. Kabi tillarda ham shunga o'xshash kelishuvlar mavjud O'zi va Newspeak.

Misol

Operatorni tasavvur qiling + quyidagi usullarda ishlatilishi mumkin:

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

Haddan tashqari yuk

Ushbu oltita funktsiya chaqiruvini boshqarish uchun to'rt xil kod bo'limi kerak - yoki uchta, agar satrlar belgilar ro'yxati deb hisoblansa:

Shunday qilib, ism + aslida uch yoki to'rtta butunlay boshqa funktsiyalarga ishora qiladi. Bu misol ortiqcha yuk(E'tibor bering, oxirgi holatda ishlatiladigan satr turlari o'z-o'zidan dasturchiga qarz bermaydi tabiiy ravishda qo'shimchani emas, balki birikishni nazarda tutadi; "123" + "456" ni ko'rib chiqing, bu "579" ga olib kelishi mumkin. Shuning uchun haddan tashqari yuk operatsiya uchun turli xil ma'nolarni yoki semantikani hamda turli xil dasturlarni taqdim etishi mumkin.)

Adabiyotlar

  1. ^ C. Straxey, Dasturlash tillaridagi asosiy tushunchalar. Kompyuter dasturlash bo'yicha Xalqaro yozgi maktab uchun ma'ruza matnlari, Kopengagen, 1967 yil avgust