Vad är dynamisk bindning?
Inom datavetenskap är namnbinding associering av en identifierare, till exempel en funktion eller variabelnamn, till ett avsnitt av kod eller data. I det vanligaste scenariot, statisk bindning, är denna mappning känd vid sammanställningstidpunkten. Vid dynamisk bindning är objektet som mappas av en funktion inte känt vid sammanställningstiden och kan endast bestämmas under programkörningstiden. Av denna anledning kallas dynamisk bindning också för sen bindning. Även om dynamisk bindning erbjuder flexibilitet som inte finns med statisk bindning innebär det också fler prestandakostnader än statisk bindning.
Dynamisk bindning är nära besläktad med polymorfism, som är en del av objektorienterad programmering. Polymorfism gör det möjligt att implementera samma metodnamn på olika sätt. Om koden inte skrivs på ett sådant sätt att den exakta metoden inte kan fastställas vid sammanställningstiden måste dynamisk bindning användas.
Till exempel kan en "Shape" -klass ha en metod som heter "GetArea", eftersom varje form har ett område. En "Circle" underklass av "Shape" skulle emellertid implementera "GetArea" annorlunda än hur en "Square" underklass skulle göra. Därför, om ett nytt objekt skapas av typen "Form", och om koden kallar metoden "GetArea" på den formen kommer kompilatorn inte att ha något sätt att veta om formen kommer att bli en cirkel eller en fyrkant, och därför den vet inte vilken GetArea-metod att ringa. Detta är ett exempel på dynamisk bindning, eftersom den korrekta GetArea-metoden kommer att kartläggas endast vid körning, efter att programmet vet vilken typ av form objektet är.
Dynamisk bindning gör det möjligt att använda abstrakta metoder utan att veta vilken specifik implementering som kommer att användas. I exemplet "Form" kan koden skrivas för att undvika dynamisk bindning genom att uttryckligen använda denna logik: Om formen är en cirkel, ring sedan cirkelns GetArea-metod; annars, om formen är en kvadrat, ring den specifika GetArea-metoden för rutor. Fördelen med dynamisk bindning är att koden är renare och mer underhållbar än alternativet. I det statiska bindningsexemplet finns kodduplicering och koden måste uppdateras när som helst en ny typ av form läggs till.
Nackdelarna med dynamisk bindning är prestanda och säkerhet. Vid statisk bindning vet kompilatorn exakt vilken kod som ska ringas och kan optimera koden så att den körs mer effektivt. Typsäkerhet kan vara ett problem eftersom, i vissa implementationer av dynamisk bindning, kan en metod kallas på ett objekt som inte stöder metoden. Till exempel kan metoden "GetArea" kallas på ett objekt som inte är en form och därför inte har någon "GetArea" -metod, vilket kan leda till ett körtidfel. Statisk bindning skulle förhindra detta scenario genom att ta upp ett sammanställningsfel.