|
|
Polymorfi og typesammenlignelighed | Polymorfi er et nøglebegreb i mange programmeringssprog - objekt-orienterede såvel som sprog i andre paradigmer. Vi introducerer her polymorfibegrebet på det generelle plan. |
| Polymorfi hentyder til situationen hvor variable og parametre kan 'have eller antage forskellige former'. I programmeringssprog ser vi ofte, at polymorfe parametre afleder polymorfe procedurerer eller funktioner. Vi taler således om, at det er procedurerne eller funktionerne, der er polymorfe. Det simple polymorfibegreb på variable (og parametre) ses altså at kunne inducere et mere avanceret polymorfibegreb på procedurer og funktioner (og metoder). |
![]() | En scene hvor klassen B som sædvanlig arver fra klassen A. Vi ser endvidere en variabel v erklæret af typen A og en metode (i en ikke angivet kontekst) med en parameter af typen A. Det centrale for vores interesse er imidlertid lovligheden af assignmentet v = e og kaldet m(e), specielt hvad angår typen af udtrykket e i forhold til klassen A. |
| Dette er de væsentlige regler for typesammenlignelighed i Java, og en del andre objekt-orienterede programmeringssprog. |
|
De viste regler
udmærker sig ved, at de kan checkes på det tidspunkt programmet
oversættes. Årsagen til dette er, at der kun indgår statiske typer i
reglerne. Dette er en stor fordel, idet man så undgår relativt
kostbare checks på programmets udførelsestidspunkt. Lad os vende tilbage til de to assignments x = y og y= x fra forrige slide. Ifølge reglen indført på denne slide er x = y lovlig, idet den statiske type af y (nemlig B) er en subklasse af den statiske type af x (nemlig A). Igen ifølge reglen er y = x ulovlig. Årsagen er, at x´s statiske type (A) ikke er en subklasse af y´s statiske type (B). Når de to assignments forekommer i den viste rækkefølge, kan det føles restriktivt ikke at tillade y = x. Forskellige sprog har forskellige konventioner på dette punkt. Nogle sprog tillader y = x, og disse sprog følger således ikke de regler, vi har formuleret på denne slides. Sådanne sprog må ty til typecheck på programmets udførelsestidspunkt. |
| Statisk typecheck er typecheck for programudførelsen starter; Det vil i praksis sige under compileringen. Når vi siger 'konservativ' mener vi her 'forsigtig' og 'garanterende'. Garantien skal sikre mod, at der ikke kan forekomme køretidsfejl som følge af typeproblemer. Når vi på køretidspunktet anvender en operation op på et objekt o gennem en variabel v (v.op(...)) ønsker vi at være sikre på, at op giver mening på det objekt (o), som v refererer. Statisk typecheck garanterer dette. |