Lecture overview -- Keyboard shortcut: 'u'  Previous page: Statiske og dynamiske typer -- Keyboard shortcut: 'p'  Next page: Statisk og dynamisk binding -- Keyboard shortcut: 'n'  Lecture notes - all slides and notes together  slide -- Keyboard shortcut: 't'  Help page about these notes  Alphabetic index  Course home  Play sound for this page -- Keyboard shortcut: 'y'  Page 28 : 41
Forelæsningsnoter i Objekt-orienteret Programmering
Nedarvning
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 betyder mangeformethed.

Med polymorfi kan variable og parametre referere til objekter af mere end én type

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.

  • Assignmentet v = e er lovligt i typemæssig forstand hvis den statiske type af e er A eller en subklasse af A

Dette er de væsentlige regler for typesammenlignelighed i Java, og en del andre objekt-orienterede programmeringssprog.

  • Kaldet m(e) er lovligt i typemæssig forstand hvis den statiske type af e er A eller en subklasse af A

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.

Reglerne for typesammenlignelighed er lavet for kunne sikre statisk typecheck efter en konservativ model

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.