uy - Dasturiy ta'minot
JAVA ob'ektga yo'naltirilgan dasturlash tushunchalari. Polimorfizm - bu nima? Genetik polimorfizm Polimorfizm va uning dasturlarda qo'llanilishi

Genetik polimorfizm - bu genlarning uzoq muddatli xilma-xilligi mavjud bo'lgan holat, ammo populyatsiyada eng kam uchraydigan genning chastotasi bir foizdan ortiq. Uning saqlanishi genlarning doimiy mutatsiyasiga, shuningdek ularning doimiy rekombinatsiyasiga bog'liq. Olimlar tomonidan olib borilgan tadqiqotlarga ko'ra, genetik polimorfizm keng tarqalgan, chunki bir necha million gen birikmalari bo'lishi mumkin.

Katta zaxira

Populyatsiyaning yangi muhitga yaxshiroq moslashishi polimorfizmning katta ta'minotiga bog'liq va bu holda evolyutsiya ancha tez sodir bo'ladi. An'anaviy genetik usullardan foydalangan holda polimorf allellarning butun sonini hisoblash amaliy emas. Buning sababi, genotipda ma'lum bir genning mavjudligi gen tomonidan aniqlangan turli xil fenotipik xususiyatlarga ega bo'lgan shaxslarni kesib o'tish orqali erishiladi. Agar ma'lum bir populyatsiyaning qaysi qismi turli xil fenotiplarga ega bo'lgan shaxslardan iboratligini bilsangiz, u holda ma'lum bir belgining shakllanishi bog'liq bo'lgan allellar sonini aniqlash mumkin bo'ladi.

Hammasi qanday boshlandi?

Genetika o'tgan asrning 60-yillarida tez rivojlana boshladi, aynan o'sha paytda gellardagi fermentlar ishlatila boshlandi, bu genetik polimorfizmni aniqlashga imkon berdi. Bu qanday usul? Uning yordami bilan oqsillar elektr maydonida harakatlanadi, bu ko'chirilayotgan oqsilning o'lchamiga, uning konfiguratsiyasiga, shuningdek, jelning turli qismlarida umumiy zaryadga bog'liq. Shundan so'ng, paydo bo'ladigan dog'larning joylashuvi va soniga qarab, aniqlangan modda aniqlanadi. Populyatsiyadagi protein polimorfizmini baholash uchun taxminan 20 yoki undan ko'p joyni tekshirishga arziydi. Keyin matematik usul yordamida gomo- va geterozigotalarning soni va nisbati aniqlanadi. Tadqiqotlarga ko'ra, ba'zi genlar monomorf bo'lishi mumkin, boshqalari esa g'ayrioddiy polimorf bo'lishi mumkin.

Polimorfizm turlari

Polimorfizm tushunchasi juda keng bo'lib, u o'tish va muvozanatli variantni o'z ichiga oladi. Bu genning selektiv qiymatiga va populyatsiyaga bosim o'tkazadigan tabiiy tanlanishga bog'liq. Bundan tashqari, u genetik va xromosoma bo'lishi mumkin.

Gen va xromosoma polimorfizmi

Gen polimorfizmi organizmda bir nechta allellar bilan ifodalanadi, buning yorqin misoli qondir. Xromosomalar xromosomalardagi buzilishlar tufayli yuzaga keladigan farqlarni ifodalaydi. Biroq, geteroxromatik hududlarda farqlar mavjud. Agar buzilish yoki o'limga olib keladigan patologiya bo'lmasa, bunday mutatsiyalar neytral hisoblanadi.

O'tish davri polimorfizmi

O'tish davri polimorfizmi populyatsiyada bir vaqtlar keng tarqalgan allel boshqasi bilan almashtirilganda yuzaga keladi, bu esa uning tashuvchisiga ko'proq moslashishni ta'minlaydi (shuningdek, ko'p allelizm deb ataladi). Berilgan xilma-xillik bilan genotiplar foizida yo'nalishli siljish mavjud, buning natijasida evolyutsiya sodir bo'ladi va uning dinamikasi amalga oshiriladi. Sanoat mexanizmi hodisasi o'tish davri polimorfizmini tavsiflovchi yaxshi misol bo'lishi mumkin. Bu nima ekanligini oddiy kapalak ko'rsatadi, u sanoat rivojlanishi bilan qanotlarining oq rangini to'q rangga o'zgartirdi. Bu hodisa Angliyada kuzatila boshlandi, u erda kapalaklarning 80 dan ortiq turlari och krem ​​gullaridan quyuq rangga aylandi, bu birinchi marta sanoatning jadal rivojlanishi tufayli 1848 yildan keyin Manchesterda sezildi. 1895 yilda allaqachon kuyalarning 95% dan ortig'i qanotlarining quyuq rangiga ega bo'lgan. Bunday o'zgarishlar daraxt tanasining tutunli bo'lishi va ochiq rangli kapalaklarning qo'ziqorin va robinlarning oson o'ljasiga aylanishi bilan bog'liq. O'zgarishlar mutant melanistik allellar tufayli sodir bo'ldi.

Balanslangan polimorfizm

"Muvozanatli polimorfizm" ta'rifi barqaror ekologik sharoitda bo'lgan populyatsiyada turli xil genotip shakllarining har qanday raqamli nisbatlarida o'zgarish yo'qligini tavsiflaydi. Bu shuni anglatadiki, nasldan naslga nisbat bir xil bo'lib qoladi, lekin doimiy bo'lgan ma'lum bir qiymat doirasida biroz o'zgarishi mumkin. O'tish davri, muvozanatli polimorfizm bilan solishtirganda - bu nima? Bu birinchi navbatda statik evolyutsiya jarayonidir. I. I. Shmalgauzen 1940 yilda unga muvozanat geteromorfizmi nomini ham bergan.

Balanslangan polimorfizmga misol

Muvozanatli polimorfizmning yaqqol misoli ko'plab monogam hayvonlarda ikki jinsning mavjudligidir. Bu ularning teng selektiv afzalliklarga ega ekanligi bilan bog'liq. Ularning bir populyatsiyadagi nisbati har doim teng. Agar populyatsiyada ko'pxotinlilik mavjud bo'lsa, ikkala jins vakillarining selektiv nisbati buzilishi mumkin, bu holda bir jins vakillari butunlay yo'q qilinishi yoki qarama-qarshi jins vakillariga qaraganda ko'proq darajada ko'payishdan chiqarib yuborilishi mumkin.

Yana bir misol, ABO tizimiga ko'ra qon guruhi bo'lishi mumkin. Bunday holda, turli xil populyatsiyalarda turli xil genotiplarning chastotasi har xil bo'lishi mumkin, lekin ayni paytda u avloddan-avlodga o'zining doimiyligini o'zgartirmaydi. Oddiy qilib aytganda, hech bir genotip boshqasidan selektiv ustunlikka ega emas. Statistik ma'lumotlarga ko'ra, birinchi qon guruhi bo'lgan erkaklar boshqa qon guruhlari bilan kuchli jinsiy aloqa vakillariga qaraganda uzoq umr ko'rishadi. Shu bilan birga, birinchi guruh ishtirokida o'n ikki barmoqli ichak yarasi rivojlanish xavfi yuqori, ammo u teshilishi mumkin va bu yordam kechiktirilsa, o'limga olib keladi.

Genetik muvozanat

Ushbu mo'rt holat yuzaga kelishi natijasida populyatsiyada buzilishi mumkin va ular ma'lum bir chastotada va har bir avlodda sodir bo'lishi kerak. Tadqiqotlar shuni ko'rsatdiki, gemostatik tizim genlarining polimorfizmlari, ularning dekodlanishi evolyutsiya jarayoni bu o'zgarishlarga yordam beradimi yoki aksincha, ularga qarshi turadimi, juda muhimdir. Agar siz ma'lum bir populyatsiyadagi mutant jarayonning borishini kuzatsangiz, uning moslashish qiymatini ham baholashingiz mumkin. Tanlash jarayonida mutatsiya chiqarib tashlanmasa va uning tarqalishiga hech qanday to'siq bo'lmasa, u birga teng bo'lishi mumkin.

Aksariyat holatlar shuni ko'rsatadiki, bunday genlarning qiymati birdan kichikdir va bunday mutantlar ko'payish qobiliyatiga ega bo'lmagan taqdirda, hamma narsa 0 ga tushadi. Bunday turdagi mutatsiyalar tabiiy tanlanish jarayonida chetga suriladi, ammo bu shunday qiladi. selektsiya yo'li bilan amalga oshiriladigan eliminatsiyani qoplaydigan bir xil gendagi takroriy o'zgarishlarni istisno qilmaydi. Keyin muvozanatga erishiladi, mutatsiyaga uchragan genlar paydo bo'lishi yoki aksincha, yo'qolishi mumkin. Bu muvozanatli jarayonga olib keladi.

Nima bo'layotganini aniq tavsiflovchi misol o'roqsimon hujayrali anemiyadir. Bunday holda, gomozigotli holatdagi dominant mutatsiyaga uchragan gen organizmning erta o'limiga yordam beradi. Geterozigotali organizmlar omon qoladi, lekin bezgak kasalligiga ko'proq moyil bo'ladi. Ushbu tropik kasallikning tarqalish joylarida o'roqsimon hujayrali anemiya genining muvozanatli polimorfizmini kuzatish mumkin. Bunday populyatsiyada homozigotlar (bir xil genlarga ega bo'lgan shaxslar) yo'q qilinadi va seleksiya geterozigotalar (turli xil genlarga ega bo'lgan shaxslar) foydasiga harakat qiladi. Populyatsiya genofondida sodir bo'ladigan ko'p vektorli tanlov tufayli har bir avlodda genotiplar saqlanib qoladi, bu organizmning atrof-muhit sharoitlariga yaxshi moslashishini ta'minlaydi. O'roqsimon hujayrali anemiya genining mavjudligi bilan bir qatorda, polimorfizmni tavsiflovchi boshqa turdagi genlar ham mavjud. Bu nima beradi? Bu savolga javob geteroz deb ataladigan hodisa bo'ladi.

Geterozigotali mutatsiyalar va polimorfizm

Geterozigotali polimorfizm retsessiv mutatsiyalar mavjudligida, hatto zararli bo'lsa ham, fenotipik o'zgarishlarning yo'qligini ta'minlaydi. Ammo shu bilan birga, ular populyatsiyada yuqori darajada to'planishi mumkin, bu zararli dominant mutatsiyalardan oshib ketishi mumkin.

evolyutsion jarayon

Evolyutsiya jarayoni uzluksiz bo'lib, uning zaruriy sharti polimorfizmdir. Buning ma'nosi ma'lum bir populyatsiyaning yashash muhitiga doimiy moslashishi. Bir guruhda yashovchi turli jinsdagi organizmlar geterozigota holatda bo'lishi va ko'p yillar davomida avloddan-avlodga o'tishi mumkin. Shu bilan birga, ularning fenotipik ko'rinishi mavjud bo'lmasligi mumkin - genetik o'zgaruvchanlikning katta zaxirasi tufayli.

Fibrinogen geni

Ko'pgina hollarda tadqiqotchilar fibrinogen gen polimorfizmini ishemik insult rivojlanishining kashshofi deb hisoblashadi. Ammo hozirgi vaqtda ushbu kasallikning rivojlanishiga genetik va orttirilgan omillar ta'sir ko'rsatishi muammosi birinchi o'ringa chiqmoqda. Ushbu turdagi insult miya tomirlarining trombozi tufayli rivojlanadi va fibrinogen genining polimorfizmini o'rganish orqali ko'plab jarayonlarni tushunish mumkin, unga ta'sir qilish orqali kasallikning oldini olish mumkin. Hozirgi vaqtda olimlar genetik o'zgarishlar va qonning biokimyoviy parametrlari o'rtasidagi bog'liqlikni etarlicha o'rganmaganlar. Keyingi tadqiqotlar kasallikning rivojlanishiga ta'sir qilish, uning kursini o'zgartirish yoki rivojlanishning dastlabki bosqichida oddiygina oldini olish imkonini beradi.

Misollar bilan pdf formatidagi taqdimot shaklida ma'ruza - 27 slayd.
Volga davlat texnika universiteti, POAS bo'limi, - 2010 yil

Ma'ruzada funksiya va usullar polimorfizmining barcha shakllari muhokama qilinadi va ularning ierarxiyasi diagramma shaklida taqdim etiladi.

Ma'ruzadan parchalar

Polimorfizm tushunchasi

  • Dasturlash tilida polimorfizm o'zgaruvchilar va funktsiyalarning bir nechta ma'nosini anglatadi
  • Polimorf funksiya har xil turdagi argumentlar bilan chaqirilishi mumkin bo‘lgan funksiya bo‘lib, amalda bajariladigan kod argumentlar turiga bog‘liq.

Polimorfizmdan foydalanishning afzalliklari

  • Polimorfizm algoritmlarni faqat bir marta yozishga va keyin hali mavjud bo'lmagan har xil turdagi ma'lumotlar uchun qayta foydalanishga imkon beradi (umumiy harakatlar yoki algoritmlar)
  • Polimorfizm kontseptual makonni toraytiradi, ya'ni. dasturchi eslashi kerak bo'lgan ma'lumotlar miqdorini kamaytiradi

Parametrlangan polimorfizm

  • C++ tilida shablon deb ataladigan umumiy funktsiyalar bilan ta'minlangan
  • Umumiy funktsiyaning argumenti uni parametrlashda ishlatiladigan turdir
  • Shablon mexanizmidan foydalanib, har xil turdagi argumentlar bilan ishlaydigan funksiya yaratishingiz mumkin
  • Bunday funksiyalarga STL dan umumlashtirilgan algoritmlarni misol qilib keltirish mumkin

Sof polimorfizm

  • Sof polimorfizm bir xil funktsiya har xil turdagi argumentlarga qo'llanilganda yuzaga keladi
  • Sof polimorfizm holatida bitta funktsiya (kod tanasi) va uning bir nechta talqinlari mavjud.
  • Sof polimorfizmni amalga oshirish faqat polimorf o'zgaruvchilar, aniqrog'i polimorf argumentlar mavjud bo'lganda mumkin.
  • Sof polimorfizm umumlashtirilgan algoritmlarni amalga oshirish imkonini beradi
Haddan tashqari yuk yoki maxsus polimorfizm
  • Haddan tashqari yuklanish bir xil nom bilan bog'langan ikki yoki undan ortiq kod mavjud bo'lganda sodir bo'ladi
  • Haddan tashqari yuklanishning asosiy maqsadi kontseptual makonni toraytirishdir
Bir-biriga bog'liq bo'lmagan sinflarda ortiqcha yuklash usullari
  • Barcha ob'ektga yo'naltirilgan tillar bir-biriga bog'liq bo'lmagan sinflarda bir xil nomdagi usullardan foydalanishga imkon beradi - bu usulni haddan tashqari yuklash.
  • Bunday holda, haddan tashqari yuklangan ism xabarni qabul qiluvchisi tegishli bo'lgan sinf haqidagi ma'lumotlardan foydalangan holda bog'lanadi

Parametrik ortiqcha yuk

  • Bir xil kontekstdagi funksiyalar va usullarning bir xil nomga ega boʻlishiga ruxsat berilgan va argumentlar soni va turlarini tahlil qilish yoʻli bilan noaniqlik bartaraf qilinadigan haddan tashqari yuklash uslubi parametrik ortiqcha yuklash deb ataladi.
O'zgartirish usuli
  • Bir xil nom va parametrlarga ega bo'lgan asosiy va hosila sinflarda ikkita usul mavjud bo'lganda bekor qilish sodir bo'ladi
  • Bunday holda, asosiy sinf usuli sinf foydalanuvchisi nuqtai nazaridan olingan sinf usuli bilan bekor qilinadi.
Usulni almashtirish mexanizmining maqsadi
  • O'zgartirish sinf foydalanuvchisi uchun shaffof tarzda sodir bo'ladi va ortiqcha yuklashda bo'lgani kabi, ikkala usul ham semantik jihatdan bitta ob'ekt sifatida ifodalanadi.
  • Usullarni almashtirishning asosiy maqsadi kontseptual makonni toraytirishdir
Usulni bekor qilish misoli

MyEllipse sinfi
{
ommaviy:
float area() const

};


{
ommaviy:
float area() const
(// samaraliroq hisoblash algoritmidan foydalaning
}
};

MyEllipse ellipsi;
MyCircle doirasi;

// MyEllipse::area() usuli chaqiriladi
ellipse.print();


// DIQQAT!!! MyEllipse::area() usuli chaqiriladi
circle.print();


Usulni bekor qilish
  • Bekor qilishda, asosiy sinf usuli hosila sinf usuli bilan faqat tashqaridan bekor qilinadi. Sinf ichida asosiy sinf usuli chaqiriladi (oldingi misolga qarang)
  • Usulni bekor qilish, olingan sinf usuli asosiy sinf usulini nafaqat tashqarida, balki sinf ichida ham almashtirganda sodir bo'ladi.
  • C++ tilida usulni bekor qilish uchun siz dinamik bog'lanish mexanizmidan foydalanishingiz kerak, ya'ni. usulni virtual deb e'lon qilish
Usulni bekor qilish misoli

MyEllipse sinfi
{
ommaviy:
virtual float maydoni() const
( /* raqamli hisoblash usuli */)
void print() ( printf("maydon = %f\n", maydon()); )
};
sinf MyCircle: ommaviy MyEllipse
{
ommaviy:
float area() const
( // samaraliroq hisoblash algoritmidan foydalaning
qaytish 3.14*Radius1*Radius2;
}
};

MyEllipse ellipsi;
MyCircle doirasi;

// MyEllipse::area() usuli chaqiriladi
printf("Ellips maydoni= %f\n", ellips.area());

// MyEllipse::area() usuli chaqiriladi
ellipse.print();

// MyCircle::area() usuli chaqiriladi
printf("Doira maydoni= %f\n", doira.area());

// DIQQAT!!! MyCircle::area() usuli chaqiriladi
circle.print();

Usulni bekor qilish mexanizmining maqsadi
  • Usullarni bekor qilish mexanizmining mavjudligi asosiy sinfda xatti-harakatlarning umumiy qismini amalga oshirishga imkon beradi, bu esa individual harakatlar hosila sinflarda yanada aniqlanishini (bekor qilinishini) anglatadi.
  • Shunday qilib, usulni bekor qilish mexanizmining asosiy maqsadi dastur hajmini kamaytirishdir

Kechiktirilgan usullar

  • Kechiktirilgan usul - bu bekor qilishning alohida holati bo'lib, unda asosiy sinf usuli amalga oshirilmaydi va har qanday foydali faoliyat bolalar sinfi usulida ko'rsatilgan.
C++ tilida kechiktirilgan usullar
  • C++ da kechiktirilgan usul virtual kalit so'z bilan aniq e'lon qilinishi kerak
  • Kechiktirilgan usulning tanasi aniqlanmagan, buning o'rniga funktsiya 0 qiymatiga "tayinlangan"

Polimorfizm (dasturlash)

Qisqacha aytganda, polimorfizmning ma'nosini "Bir interfeys, ko'plab ilovalar" iborasida ifodalash mumkin.

Polimorfizm - ob'ektga yo'naltirilgan dasturlashning to'rtta muhim mexanizmlaridan biri (abstraktsiya, inkapsulyatsiya va meros bilan birga).

Polimorfizm sizga ko'proq mavhum dasturlarni yozish va kodni qayta ishlatishni oshirish imkonini beradi. Ob'ektlarning umumiy xossalari tizimga birlashtirilgan bo'lib, ularni turlicha - interfeys, sinf deb atash mumkin. Jamiyat tashqi va ichki ifodaga ega:

  • tashqi umumiylik bir xil nomlar va imzolar (usullarning nomlari, argumentlar turlari va ularning soni) bilan bir xil usullar to'plami sifatida namoyon bo'ladi;
  • ichki umumiylik - usullarning bir xil funksionalligi. U intuitiv tarzda tasvirlanishi yoki qat'iy qonunlar, usullar bo'ysunishi kerak bo'lgan qoidalar shaklida ifodalanishi mumkin. Bitta usulga (funktsiya, operatsiya) turli funksionallikni belgilash qobiliyati deyiladi usulni ortiqcha yuklash (funksiyaning haddan tashqari yuklanishi, operatsiyalarning ortiqcha yuklanishi).

Misollar

Geometrik shakllar sinfi (ellips, ko'pburchak) geometrik o'zgarishlar (o'zgartirish, aylantirish, masshtablash) usullariga ega bo'lishi mumkin.

Funktsional tillarda

Xaskellda polimorfizmning ikki turi mavjud - parametrik (sof) va maxsus (sinfga asoslangan). Maxsus deb ham ataladi maxsus(Lotin tilidan ad hoc - maxsus). Ularni quyidagicha ajratish mumkin:

Parametrik polimorfizm

Maxsus polimorfizm

Haskellda OOPda topilmagan sinflar va misollarga bo'linish mavjud. Sinf usullar to'plamini va imzolarini belgilaydi (ehtimol, ularning ba'zilari yoki barchasi uchun standart ilovalarni beradi) va misollar ularni amalga oshiradi. Shunday qilib, bir nechta meros muammosi avtomatik ravishda yo'qoladi. Sinflar boshqa sinflarning usullarini meros qilib olmaydi yoki bekor qilmaydi - har bir usul faqat bitta sinfga tegishli. Ushbu yondashuv OOPdagi sinf munosabatlarining murakkab diagrammasidan ko'ra soddadir. Berilgan ma'lumotlar turi bir nechta sinflarga tegishli bo'lishi mumkin; sinf uning har bir turi boshqa sinfga yoki hatto bir nechta sinfga tegishli bo'lishini talab qilishi mumkin; xuddi shunday talab instansiya tomonidan qo'yilishi mumkin. Bular ko'p merosning analoglari. OOPda o'xshashi bo'lmagan ba'zi xususiyatlar ham mavjud. Misol uchun, ro'yxatni solishtiriladigan miqdorlar sinfining namunasi sifatida amalga oshirish, ro'yxat elementlarining ham taqqoslanadigan miqdorlar sinfiga tegishli bo'lishini talab qiladi.

OOP dan FP ga o'tadigan dasturchilar o'zlarining sinf tizimlari o'rtasidagi muhim farqni bilishlari kerak. Agar OOPda sinf ob'ektga, ya'ni ma'lumotlarga "bog'langan" bo'lsa, FPda u funktsiyaga bog'langan. FPda sinfga a'zolik haqidagi ma'lumotlar ob'ekt maydonlarida saqlanmasdan, funksiya chaqirilganda uzatiladi. Bunday yondashuv, xususan, bir nechta ob'ektlar usuli masalasini hal qilish imkonini beradi (OOPda usul bitta ob'ektda chaqiriladi). Misol: qo'shish usuli (raqamlar, satrlar) bir xil turdagi ikkita argumentni talab qiladi.

Yashirin yozish

Ba'zi dasturlash tillari (masalan, Python va Ruby) imzo polimorfizmining bir turi bo'lgan o'rdak terish (boshqa nomlar: yashirin, yashirin) dan foydalanadi. Shunday qilib, masalan, Pythonda polimorfizm meros bilan bog'liq emas.

Polimorfizm shakllari

Statik va dinamik polimorfizm

(Manba bo'lgan Sutter va Aleksandreskuning klassik kitobida eslatib o'tilgan).

Polimorfizmni kodda moslashtirish nuqtalarining mavjudligi, dasturchi tomonidan yozilgan bir xil kod qismi biror narsaga qarab turli xil operatsiyalarni anglatishi mumkin deb tushunish mumkin.

Bir holatda, fragmentning o'ziga xos ma'nosi kod yaratilgan muhitga bog'liq. Bu deb ataladigan narsa statik polimorfizm. Funktsiyani haddan tashqari yuklash va C++ dagi shablonlar statik polimorfizmni amalga oshiradi. Agar, masalan, shablon sinfi kodida std::sort chaqirilgan bo'lsa, unda qo'ng'iroqning haqiqiy ma'nosi ushbu shablon qaysi turdagi parametrlar uchun qo'llanilishiga bog'liq - std::sort dan biri chaqiriladi. .

Boshqa holatda, fragmentning o'ziga xos ma'nosi faqat ijro etilish bosqichida aniqlanadi va ob'ekt aniq qanday va qaerda qurilganiga bog'liq. Bu virtual usullar orqali amalga oshiriladigan oddiy, dinamik polimorfizm.

Inklyuziya polimorfizmi

Bu polimorfizm sof polimorfizm deyiladi. Polimorfizmning ushbu shaklidan foydalanib, tegishli ob'ektlar umumiy tarzda ishlatilishi mumkin. O'zgartirish va qo'shish polimorfizmidan foydalanib, TPerson ob'ektlarining barcha turlari bilan ishlashning bitta usulini yozishingiz mumkin. Inklyuziya va almashtirish polimorfizmidan foydalanib, siz "is-A" testidan o'tgan har qanday ob'ekt bilan ishlashingiz mumkin. Inklyuziv polimorfizm dasturga yangi subtiplarni qo'shish ishini soddalashtiradi, chunki har bir yangi tur uchun ma'lum bir usulni qo'shishning hojati yo'q, siz mavjudidan foydalanishingiz mumkin, faqat undagi tizimning harakatini o'zgartirish orqali. Polimorfizm bilan siz asosiy sinfni qayta ishlatishingiz mumkin; asosiy sinf foydalanadigan har qanday avlod yoki usullardan foydalaning.

Parametrik polimorfizm

Parametrik polimorfizmdan foydalanib, universal tayanch turlarini yaratishingiz mumkin. Parametrik polimorfizm holatida funktsiya barcha turlar uchun teng ravishda amalga oshiriladi va shuning uchun funktsiya ixtiyoriy tur uchun amalga oshiriladi. Parametrik polimorfizm parametrik usullar va turlarni qamrab oladi.

Parametrik usullar

Agar inklyuziya polimorfizmi ob'ektni idrok etishimizga ta'sir qilsa, parametrik polimorfizm qo'llaniladigan usullarga ta'sir qiladi, chunki turlarni e'lon qilishni ish vaqtigacha kechiktirib, tegishli sinflarning usullarini yaratish mumkin. Har bir tur uchun alohida usul yozmaslik uchun parametrik polimorfizm qo'llaniladi, bunda parametrlar turi operandlar bilan bir xil parametr bo'ladi.

Parametrik turlari

Har bir aniq tip uchun sinf yozish o'rniga biz dasturni bajarish jarayonida amalga oshiriladigan tiplarni yaratishimiz kerak, ya'ni parametrik tip yaratamiz.

Polimorfizmni bekor qilish

Mavhum usullar ko'pincha kechiktirilgan usullar deb ataladi. Ushbu usul aniqlangan sinf usulni chaqirishi mumkin va polimorfizm kechiktirilgan usulning tegishli versiyasini bolalar sinflarida chaqirishini ta'minlaydi. Ad hoc polimorfizm har bir ma'lumot turi uchun maxsus amalga oshirish imkonini beradi.

Polimorfizm - ortiqcha yuk

Bu polimorfizmning alohida holati. Haddan tashqari yuklash yordamida bir xil nom turli usullarni belgilashi mumkin va usullar parametrlarning soni va turi bo'yicha farq qilishi mumkin, ya'ni ular argumentlariga bog'liq emas. Usul juda ko'p turli xil turdagi o'ziga xos parametr turlari bilan cheklanmasligi mumkin.

Funktsional va ob'ektga yo'naltirilgan dasturlashda polimorfizmni taqqoslash

FP va OOPdagi sinf tizimlari boshqacha tuzilgan, shuning uchun ular orasidagi taqqoslashga juda ehtiyotkorlik bilan yondashish kerak.

Polimorfizm - bu dasturlash tilining ancha izolyatsiya qilingan xususiyati. Masalan, C++ tilidagi sinflar dastlab C uchun preprotsessor sifatida amalga oshirilgan. Xaskell uchun maxsus polimorfizmdan foydalanadigan dasturlarni faqat parametrik polimorfizmga ega dasturlarga tarjima qilish algoritmi mavjud.

FP va OOPdagi sinf tizimlari o'rtasidagi konseptual farqlarga qaramay, ular taxminan bir xil tarzda - virtual usullar jadvallari yordamida amalga oshiriladi.Ko'pincha Java-da qo'llaniladi.

Shuningdek qarang

Havolalar

Eslatmalar


Wikimedia fondi. 2010 yil.

Boshqa lug'atlarda "Polimorfizm (dasturlash)" nima ekanligini ko'ring:

    Bu atamaning boshqa maʼnolari ham bor, qarang: Polimorfizm. Kompyuter virusi polimorfizmi (yunoncha: pōlí ko'p + yunoncha: mōrōk shakl, ko'rinish) - zararli dasturlar mualliflari tomonidan qo'llaniladigan maxsus texnika... ... Vikipediya

    Ob'ektga yo'naltirilgan dasturlashda ob'ektning xabarda olingan ma'lumotlar turiga qarab to'g'ri usulni tanlash qobiliyati. Ingliz tilida: Polimorfizm Shuningdek qarang: Ob'ektga yo'naltirilgan dasturlash Moliyaviy lug'at... ... Moliyaviy lug'at

    Polimorfizm (dasturlash tillarida) - bir xil interfeysga ega bo'lgan ob'ektlarning almashinishi. Dasturlash tili polimorfizmni qo'llab-quvvatlaydi, agar bir xil spetsifikatsiyaga ega sinflar turli xil ilovalarga ega bo'lsa, masalan, sinfni amalga oshirish... ... Vikipediya

sinflar atributlar to'plami bilan emas, balki semantika bilan belgilanadi. Masalan, "barqaror" va "ot" ob'ektlari bir xil xususiyatlarga ega bo'lishi mumkin: narx va yosh. Bundan tashqari, ular bitta sinfga tegishli bo'lishi mumkin, agar ular vazifada oddiygina mahsulot sifatida ko'rib chiqilsa yoki turli sinflarga tegishli bo'lishi mumkin, agar vazifa doirasida ular boshqacha qo'llanilsa, ya'ni. Ularga nisbatan turli harakatlar amalga oshiriladi.

Ob'ektlarni sinflarga birlashtirish muammoni umumiyroq shaklda ko'rib chiqishga imkon beradi. Sinf o'sha sinfning barcha ob'ektlariga tegishli nomiga ega (masalan, "ot"). Bundan tashqari, sinf ob'ektlar uchun aniqlangan atributlarning nomlarini o'z ichiga oladi. Shu ma'noda sinf tavsifi protsessual dasturlashda keng qo'llaniladigan tuzilma yoki yozuv (yozuv) turining tavsifiga o'xshaydi; Bundan tashqari, har bir ob'ekt strukturaning namunasi bilan bir xil ma'noga ega (mos keladigan turdagi o'zgaruvchi yoki doimiy).

Rasmiy ravishda Sinf holatini belgilaydigan ko'rsatilgan parametrlarga ega bo'lgan ma'lum turdagi ob'ektlarning xatti-harakatlari namunasidir. Xuddi shu sinfning barcha misollari (bir xil sinfdan olingan ob'ektlar) bir xil xususiyatlar to'plamiga va umumiy xatti-harakatlarga ega, ya'ni ular bir xil xabarlarga bir xil munosabatda bo'lishadi.

Ga muvofiq UML(Yagona modellashtirish tili - birlashtirilgan modellashtirish tili), sinf quyidagi grafik tasvirga ega.

Sinf uch qismdan iborat to'rtburchaklar shaklida tasvirlangan. Yuqori qismda sinf nomi, o'rtada sinf ob'ektlarining xossalari, pastki qismida esa ushbu sinf ob'ektlari (usullari) bilan bajarilishi mumkin bo'lgan amallar joylashgan.

Har bir sinf, shuningdek, ushbu sinf ob'ektlari yaratilganda va yo'q qilinganda avtomatik ravishda chaqiriladigan maxsus usullarga ega bo'lishi mumkin:

  • konstruktor(konstruktor) - ob'ektlarni yaratishda bajariladi;
  • buzuvchi(destruktor) - ob'ektlar yo'q qilinganda bajariladi.

Odatda, konstruktor va destruktor maxsus sintaksisga ega bo'lib, ular oddiy sinf usullarini yozish uchun ishlatiladigan sintaksisdan farq qilishi mumkin.

Inkapsulyatsiya

Inkapsulyatsiya(inkapsulyatsiya) sinfning amalga oshirilishini yashiradi va uning ichki ko'rinishini tashqi (interfeys)dan ajratadi. Ob'ektga yo'naltirilgan yondashuvdan foydalanganda, sinfning xususiyatlariga boshqa sinflar usullaridan to'g'ridan-to'g'ri kirish odatiy hol emas. Sinf xususiyatlariga kirish uchun uning xususiyatlarini olish va o'zgartirish uchun ushbu sinfning maxsus usullaridan foydalanish odatiy holdir.

Ob'ekt ichida ma'lumotlar va usullar turli darajadagi ochiqlik (yoki foydalanish imkoniyati) bo'lishi mumkin. Java tilida qabul qilingan qulaylik darajalari 6-bobda batafsil muhokama qilinadi. Ular sizga inkapsulyatsiya xususiyatini yanada aniqroq boshqarish imkonini beradi.

Sinfning umumiy a'zolari ob'ektning tashqi interfeysini tashkil qiladi. Bu boshqalar uchun mavjud bo'lgan funksionallik. Sinfning barcha xossalari odatda shaxsiy, shuningdek, amalga oshirish tafsilotlari bo'lgan va tizimning boshqa qismlari bog'liq bo'lmasligi kerak bo'lgan yordamchi usullar deb e'lon qilinadi.

Amalga oshirishni sinfning tashqi interfeysi orqasida yashirish orqali siz tizimning boshqa komponentlari kodini o'zgartirmasdan alohida sinfning ichki mantiqini o'zgartirishingiz mumkin. Bu xususiyat deyiladi modullilik.

Sinf xususiyatlariga faqat uning usullari orqali kirish mumkinligini ta'minlash ham bir qator afzalliklarni beradi. Birinchidan, bu maydonlarning to'g'ri qiymatlarini boshqarishni ancha osonlashtiradi, chunki xususiyatlarga to'g'ridan-to'g'ri kirishni kuzatish mumkin emas, ya'ni ularga noto'g'ri qiymatlar berilishi mumkin.

Ikkinchidan, ma'lumotlarni saqlash usulini o'zgartirish qiyin bo'lmaydi. Agar ma'lumot fayl tizimi yoki ma'lumotlar bazasi kabi xotiradan tashqari xotirada saqlansa, bu funksiyani butun tizimda amalga oshirishdan ko'ra, faqat bitta sinfda bir nechta usullarni o'zgartirishingiz kerak bo'ladi.

Nihoyat, ushbu printsip yordamida yozilgan kodni disk raskadrovka qilish osonroq. Bizni qiziqtirgan ob'ektning xususiyati kim va qachon o'zgarganligini bilish uchun ushbu ob'ektning xususiyatiga kirish mumkin bo'lgan ob'ekt usuliga disk raskadrovka ma'lumotlarining chiqishini qo'shish kifoya. Ob'ekt xususiyatlariga to'g'ridan-to'g'ri kirishdan foydalanganda, dasturchi qiziqtirgan ob'ekt ishlatiladigan kodning barcha bo'limlariga disk raskadrovka ma'lumotlari chiqishini qo'shishi kerak edi.

Meros olish

Meros olish Meros - bu sinflar o'rtasidagi munosabat bo'lib, unda sinf boshqa sinfning (bitta meros) yoki boshqa sinflarning (bir nechta meros) tuzilishi yoki xatti-harakatlaridan foydalanadi. Meros davlat/xususiy ierarxiyani joriy qiladi, unda kichik sinf bir yoki bir nechta keng tarqalganlardan meros bo'lib o'tadi supersinflar. Kichik sinflar odatda meros qilib olingan tuzilma va xatti-harakatlarni kengaytiradi yoki bekor qiladi.

Misol tariqasida, biz "Avtomobil" va "Yuk mashinasi" sinflarini amalga oshirish zarur bo'lgan muammoni ko'rib chiqishimiz mumkin. Shubhasiz, bu ikki sinf umumiy funksionallikka ega. Shunday qilib, ularning ikkalasi ham 4 ta g'ildirak, dvigatel, harakatlana oladi va hokazo. Har qanday avtomobil yuk mashinasi yoki yo'lovchi avtomobili, 5 yoki 12 o'rinli bo'lishidan qat'i nazar, bu barcha xususiyatlarga ega. Turli sinflarda bir xil kodni qayta-qayta yozmaslik uchun ushbu umumiy xususiyatlar va funksionallikni alohida sinfga, masalan, "Avtomobil" ga kiritish va undan "Avtomobil" va "Yuk mashinasi" sinflarini meros qilib olish maqsadga muvofiqdir.


Umumlashtirish munosabati oxirida uchburchak o'q bo'lgan qattiq chiziq bilan ko'rsatilgan. O'q umumiy sinfga ishora qiladi ( ajdodlar sinfi yoki supersinf) va uning yo'qligi - yanada maxsus sinfga ( bolalar sinfi yoki kichik sinf).

Merosdan foydalanish o'xshash ob'ektlarni tavsiflash uchun yaratilgan kod miqdorini kamaytirishga yordam beradi, shuningdek, yanada samarali va moslashuvchan kod yozishga yordam beradi.

Ko'rib chiqilgan misolda yagona meros qo'llaniladi. Sinf bir vaqtning o'zida bir nechta sinflarning xususiyatlari va xatti-harakatlarini meros qilib olishi mumkin. Ko'p merosdan foydalanishning eng mashhur namunasi - bu uy hayvonlari do'konida mahsulotni inventarizatsiya qilish tizimini loyihalash.

Uy hayvonlari do'konidagi barcha hayvonlar "Hayvon" sinfining merosxo'rlari, shuningdek, "Mahsulot" sinfining merosxo'rlaridir. Bular. ularning barchasi yoshi bor, oziq-ovqat va suvga muhtoj va ayni paytda narxga ega va sotilishi mumkin.

Diagrammada bir nechta merosxo'rlik xuddi bitta merosga o'xshash tarzda tasvirlangan, faqat meros chiziqlari avlod sinfini bir vaqtning o'zida bir nechta yuqori sinflarga bog'laydi.

Barcha ob'ektga yo'naltirilgan dasturlash tillarida bir nechta merosni tavsiflash uchun til konstruktsiyalari mavjud emas.

Java-da bir nechta meros interfeyslar orqali cheklangan qo'llab-quvvatlanadi va 8-bobda ko'rib chiqiladi.

Polimorfizm

Polimorfizm dagi asosiy tushunchalardan biridir ob'ektga yo'naltirilgan dasturlash meros va inkapsulyatsiya bilan birga. "Polimorfizm" so'zi yunoncha bo'lib, "ko'p shaklga ega" degan ma'noni anglatadi. U bilan bog'liq holda nimani anglatishini tushunish uchun ob'ektga yo'naltirilgan dasturlash, keling, bir misolni ko'rib chiqaylik.

Aytaylik, biz vektorli grafik muharriri yaratmoqchimiz, unda biz sinflar ko'rinishidagi grafik primitivlar to'plamini tasvirlashimiz kerak - Point, Line, Circle, Box va boshqalar. Ushbu sinflarning har biri uchun ekranda mos keladigan primitivni ko'rsatish uchun chizish usulini aniqlaymiz.

Shubhasiz, siz chizmani ko'rsatish uchun kod yozishingiz kerak bo'ladi, agar kerak bo'lsa, chizish paytida ekranda mavjud bo'lgan barcha ibtidoiy elementlarni ketma-ket takrorlaydi va ularning har birida chizish usulini chaqiradi. Polimorfizm bilan tanish bo'lmagan odam, ehtimol, bir nechta massivlarni (har bir ibtidoiy tip uchun alohida massiv) yaratadi va har bir massivdagi elementlarni ketma-ket takrorlaydigan va har bir elementda chizish usulini chaqiradigan kodni yozadi. Natijada taxminan quyidagi kod bo'ladi:

... //Maksimum // sig'imi 1000 bo'lgan Point obyektlarini // o'z ichiga olishi mumkin bo'lgan bo'sh massiv yaratish Point p = new Point; l qatori = yangi qator; Circle c = yangi doira; b qutisi = yangi quti; ... // faraz qilaylik, shu nuqtada // barcha massivlar mos keladigan // obyektlar bilan to‘ldirilgan... for(int i = 0; i)< p.length;i++) { //цикл с перебором всех ячеек массива. //вызов метода draw() в случае, // если ячейка не пустая. if(p[i]!=null) p[i].draw(); } for(int i = 0; i < l.length;i++) { if(l[i]!=null) l[i].draw(); } for(int i = 0; i < c.length;i++) { if(c[i]!=null) c[i].draw(); } for(int i = 0; i < b.length;i++) { if(b[i]!=null) b[i].draw(); } ...

Yuqorida yozilgan kodning kamchiligi shundaki, har bir turdagi ibtidoiylarni ko'rsatish uchun deyarli bir xil kodning takrorlanishi. Grafik muharririmizni yanada modernizatsiya qilish va grafik primitivlarning yangi turlarini, masalan, Matn, Yulduz va boshqalarni chizish qobiliyatini qo'shish bilan biz mavjud kodni o'zgartirishga va yangi massivlarning ta'riflarini qo'shishga to'g'ri kelishi ham noqulay. unga, shuningdek, ular tarkibidagi elementlarni qayta ishlash.

Polimorfizmdan foydalanib, biz bunday funktsiyani amalga oshirishni sezilarli darajada soddalashtira olamiz. Avvalo, umumiy ota-onani yarataylik

Salom! Bu OOP tamoyillaridan biri - polimorfizm haqida maqola.

Polimorfizm nima

Polimorfizmning ta'rifi qo'rqinchli ko'rinadi :)

Polimorfizm- bu bir sinfda yoki meros munosabatlari bilan bog'liq bo'lgan sinflar guruhida bir xil yoki turli xil parametrlar to'plamiga ega bir xil nomdagi usullardan foydalanish imkoniyati.

so'z " polimorfizm"Murakkab ko'rinishi mumkin - lekin unday emas. Siz shunchaki ushbu ta'rifni qismlarga bo'lishingiz va nimani anglatishini misollar bilan ko'rsatishingiz kerak. Ishoning, maqolaning oxirida polimorfizmning ushbu ta'rifi sizga aniq ko'rinadi :)

Polimorfizm, agar tarjima qilingan bo'lsa, bu degani "ko'p shakllar" Masalan, teatrdagi aktyor ko'p rollarni sinab ko'rishi yoki "ko'p shakllarni" olishi mumkin.

Bizning kodimiz bir xil - polimorfizm tufayli u OOP tamoyillaridan foydalanmaydigan dasturlash tillariga qaraganda ancha moslashuvchan bo'ladi.

Xo'sh, biz qanday shakllar haqida gapirayapmiz? Keling, avvalo misollar keltiramiz va polimorfizm amalda qanday namoyon bo'lishini ko'rsatamiz, so'ngra uning ta'rifiga qaytamiz.

Polimorfizm qanday namoyon bo'ladi?

Gap shundaki agar Java polimorfizm printsipiga ega bo'lmasa, kompilyator buni xato sifatida izohlaydi:

Ko'rib turganingizdek, rasmdagi usullar ular qabul qilgan qiymatlarda farqlanadi:

  • birinchi qabul qiladi int
  • ikkinchisi esa qabul qiladi String

Biroq, Java polimorfizm printsipidan foydalanganligi sababli, kompilyator buni xato deb hisoblamaydi, chunki bunday usullar boshqacha ko'rib chiqiladi:

Bir xil nomlash usullari juda qulay. Misol uchun, agar bizda raqamning kvadrat ildizini qidiradigan usul mavjud bo'lsa, bitta nomni eslab qolish ancha osonlashadi (masalan, sqrt()) har bir tur uchun yozilgan bir xil usul uchun bir nechta alohida nom:

Ko'rib turganingizdek, biz har bir usul uchun alohida nom topishimiz shart emas - lekin asosiysi ularni eslab qolishdir! Juda qulay.

Endi siz ushbu tamoyil nima uchun tez-tez quyidagi ibora bilan tasvirlanganligini tushunishingiz mumkin:

Bitta interfeys - ko'p usullar

Bu biz bir nechta usullarga kirishimiz mumkin bo'lgan bitta nomni (bitta interfeys) to'ldirishimiz mumkinligini nazarda tutadi.

Usulni ortiqcha yuklash

Biz yuqorida ko'rsatgan narsa - bir xil nom va turli xil parametrlarga ega bo'lgan bir nechta usullar deyiladi ortiqcha yuk. Ammo bu usulni haddan tashqari yuklashga misol bo'ldi bitta sinfda. Ammo yana bir holat bor - ota-ona sinfining usullarini bekor qilish.

Ota-ona usullarini bekor qilish

Biz sinfni meros qilib olsak, uning barcha usullarini meros qilib olamiz. Ammo agar biz meros qilib olgan usullardan birini o'zgartirmoqchi bo'lsak, uni bekor qilishimiz mumkin. Biz, masalan, ehtiyojlarimiz uchun o'xshash nom bilan alohida usul yaratishga majbur emasmiz va meros qilib olingan usul bizning sinfimizda "o'lik vazn" bo'ladi.

Biz ota-onadan meros bo'lib qolgan sinf bilan bir xil nomdagi avlod sinfida sinf yaratishimiz mumkinligi bekor qilish deb ataladi.

Misol

Tasavvur qilaylik, bizda shunday tuzilma bor:

Sinf ierarxiyasining yuqori qismida sinf joylashgan Hayvon. U uchta sinfga meros bo'lib o'tadi - Mushuk, It Va Sigir.

“Hayvon” sinfida “ovoz” usuli mavjud. Ushbu usul ekranda "Ovoz" xabarini ko'rsatadi. Tabiiyki, na it, na mushuk "Ovoz" demaydi :) Ular xirillab, miyovlaydilar. Shunga ko'ra, siz sinflar uchun boshqa usulni o'rnatishingiz kerak Mushuk, It Va Sigir- shunday qilib, mushuk miyovlaydi, it hurlaydi va sigir "Moo" deydi.

Shuning uchun, avlod sinflarida biz usulni bekor qilamiz ovoz(), shuning uchun biz konsolda "Meow", "Woof" va "Moo" ni qabul qilamiz.

  • Iltimos, diqqat qiling: biz bekor qilgan usuldan oldin biz yozamiz " @Override". Bu kompilyatorga metodni bekor qilmoqchi ekanligimizni bildiradi.

Xo'sh, polimorfizm nima

Biroq, polimorfizm printsipdir. Yuqorida biz keltirgan barcha haqiqiy misollar shunchaki yo'llari polimorfizmni amalga oshirish.

Keling, maqolaning boshida bergan ta'rifni yana bir bor ko'rib chiqaylik:

Polimorfizm- bir sinfda yoki meros munosabatlari bilan bog'liq bo'lgan sinflar guruhida bir xil yoki turli xil parametrlar to'plamiga ega bir xil nomdagi usullardan foydalanish qobiliyati.

Aniqroq ko'rinadi, shunday emasmi? Biz buni qanday qila olishingizni ko'rsatdik:

  • bitta sinfda "bir xil nomdagi usullar" yaratish ("usulni ortiqcha yuklash")
  • yoki ota-ona sinf usullarining xatti-harakatlarini o'zgartiring ("usulni bekor qilish").

Bularning barchasi polimorfizm tufayli ob'ektga yo'naltirilgan tillarning "moslashuvchanligi oshishi" ning namoyonidir.

Umid qilamizki, bizning maqolamiz siz uchun foydali bo'ldi. Java kurslarimizda roʻyxatdan oʻtishingiz mumkinbizda bor.



 


O'qing:



Kompyuterlar haqida qiziqarli faktlar

Kompyuterlar haqida qiziqarli faktlar

Monitor yoki displey - bu kompyuterning video adapteri tomonidan yaratilgan tasvirlarni ko'rsatish uchun ixcham qurilma, ya'ni ...

"Karib dengizi qaroqchilari" filmining kreditdan keyingi sahnasi: o'lik odamlar ertak aytishmaydi.

Hayotning shiddatli sur'ati tufayli kino premyeralarini o'tkazib yuborishdan charchadingizmi? Noqulay vaqtda qimmatli filmlar berayotgan telekanallardan charchadim...

An'anaviy ommaviy axborot vositalari

An'anaviy ommaviy axborot vositalari

Yangiliklarni ijtimoiy tarmoqlarda baham ko'ring! Yuqori texnologiyalar davrida ma'lumotlarni saqlash va undan foydalanish muhim insoniy omillardan biridir. Oddiy uchun...

27-sonli "Axborot to'g'risida" Federal qonuni

27-sonli

Ushbu Federal qonun quyidagi asosiy tushunchalardan foydalanadi: 1) axborot - ma'lumotlar (xabarlar, ma'lumotlar), ularning shaklidan qat'i nazar...

tasma tasviri RSS