Kas yra dinaminis įrišimas?

Informatikos moksle vardo susiejimas yra identifikatoriaus, pvz., funkcijos arba kintamojo pavadinimo, susiejimas su kodo ar duomenų dalimi. Pagal dažniausiai pasitaikantį scenarijų, statinį susiejimą, šis atvaizdavimas žinomas kompiliavimo metu. Dinaminio susiejimo metu objektas, susietas su funkcija, kompiliavimo metu nėra žinomas ir gali būti nustatytas tik programos vykdymo metu. Dėl šios priežasties jis dar vadinamas vėlyvuoju įrišimu. Nors tai suteikia lankstumo, kurio nėra naudojant statinį įrišimą, jis taip pat reikalauja daugiau veiklos sąnaudų nei statinis įrišimas.

Dinaminis įrišimas yra glaudžiai susijęs su polimorfizmu, kuris yra objektinio programavimo dalis. Polimorfizmas leidžia tą patį metodo pavadinimą įgyvendinti įvairiais būdais. Jei kodas parašytas ne taip, kad kompiliavimo metu negalima nustatyti tikslaus metodo, reikia naudoti dinaminį įrišimą.

Pavyzdžiui, „Shape“ klasėje gali būti metodas, vadinamas „GetArea“, nes kiekviena forma turi sritį. Tačiau „Shape“ poklasis „Circle“ įgyvendintų „GetArea“ kitaip nei „Kvadratinis“ poklasis. Todėl, jei sukuriamas naujas objektas, kurio tipas yra „Shape“, ir jei kodas toje formoje iškviečia metodą „GetArea“, kompiliatorius negalės žinoti, ar forma bus apskritimas ar kvadratas, todėl jis nežinos, kurį GetArea metodą iškviesti. Tai yra dinaminio susiejimo pavyzdys, nes teisingas GetArea metodas bus susietas tik vykdymo metu, programai sužinojus, kokios formos yra objektas.

Dinaminis susiejimas leidžia lanksčiai naudoti abstrakčius metodus, nežinant, kuris konkretus įgyvendinimas bus naudojamas. „Shape“ pavyzdyje kodas gali būti parašytas, kad būtų išvengta dinaminio susiejimo, naudojant šią logiką: Jei figūra yra apskritimas, tada iškvieskite apskritimo GetArea metodą; kitu atveju, jei forma yra kvadratas, kvieskite konkretų GetArea metodą kvadratams. Dinaminio susiejimo pranašumas yra tas, kad kodas yra švaresnis ir lengviau prižiūrimas nei alternatyva. Statinio įrišimo pavyzdyje yra kodo dubliavimas ir kodas turi būti atnaujintas kiekvieną kartą, kai pridedama naujo tipo forma.

Trūkumai yra našumas ir saugumas. Statinio susiejimo metu kompiliatorius tiksliai žino, kokį kodą iškviesti, ir gali optimizuoti kodą, kad jis veiktų efektyviau. Tipo sauga gali būti problema, nes kai kuriuose dinaminio susiejimo diegimuose metodas gali būti iškviestas objekte, kuris nepalaiko šio metodo. Pavyzdžiui, „GetArea“ metodas gali būti iškviestas objekte, kuris nėra forma ir todėl neturi „GetArea“ metodo, todėl gali atsirasti vykdymo laiko klaida. Statinis susiejimas užkirstų kelią šiam scenarijui, nes atsiras kompiliavimo klaida.